最近真是所有时间都奉献给工作了,包括下班后,连续加了两个星期的班,都没时间写博客……
(借口!!!中午两个小时够写一篇啦!!!哈哈,我错了,是懒……)
23个设计模式才写了3个,我只想说一声,“”革命尚未成功,同志仍需努力呀!"
好了,胡扯到此结束,回到正题。今天我们来捋一捋工厂方法模式。这个模式很容易理解,如其名,无非就是为了偷懒,对某种事物进行工厂式的批量生产。
工厂方法有三种模式:普通工厂方法模式、多个工厂生产模式和静态工厂方法模式。
下面我们一一来揭开它的真面目。
一、普通工厂方法模式
建立一个工厂类,对实现了同一接口的一些类进行实例的创建,举个例子,发送消息,可以使邮件发送也可以是sms发送,我管他是什么消息,给工厂方法一个类型,我要什么就给我生产什么就好了,看类图:
首先,创建邮件和sms的共同接口
Sender.java
package com.freedom.factory;
public interface Sender {
public void send();
}
然后,创建邮件发送消息的实现类
MailSender.java
package com.freedom.factory;
public class MailSender implements Sender {
@Override
public void send() {
System.out.println("mail");
}
}
创建SMS发送消息的实现类
SmsSender.java
package com.freedom.factory;
public class SmsSender implements Sender {
@Override
public void send() {
System.out.println("sms");
}
}
接着,建立消息生产工厂
SendFactory.java
package com.freedom.factory;
public class SendFactory {
//指定生产类型
public Sender produce(String type){
if("mail" .equals(type))
return new MailSender();
else if("sms" .equals(type))
return new SmsSender();
else{
System.out.println("请输入正确的类型");
return null;
}
}
}
最后,我们test一下,看看这个工厂能不能正确生产
@Test
public void test() {
SendFactory sf = new SendFactory();
Sender send = sf.produce("sms");
send.send();
}
输出结果:sms
二、多个工厂方法模式
对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:
package com.freedom.factory;
public class SendFactory2 {
//生产邮件消息
public Sender produceMail(){
return new MailSender();
}
//生产SMS消息
public Sender produceSms(){
return new SmsSender();
}
}
test
@Test
public void test2() {
SendFactory2 sf = new SendFactory2();
Sender send = sf.produceMail();
send.send();
Sender send2 = sf.produceSms();
send2.send();
}
输出结果:mail
sms
三、静态生产工厂方法
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
package com.freedom.factory;
public class SendFactory3 {
public static Sender produceMail(){
return new MailSender();
}
public static Sender produceSms(){
return new SmsSender();
}
}
test
@Test
public void test3() {
Sender send = SendFactory3.produceMail();
send.send();
Sender send2 = SendFactory3.produceSms();
send2.send();
}
输出结果同上。
小结:
工厂模式适用范围:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。
在以上的三种模式中,普通工厂方法模式如果传入的字符串有误,不能正确创建对象,静态工厂方法模式相对于多种工厂方法模式,不需要实例化工厂类,所以,大多数情况下,静态工厂方法模式更常用。
缺点:工厂方法模式有一个问题,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。下一篇我们来详细介绍一下抽象工厂模式。
下载源码:http://download.csdn.net/detail/github_22022001/8290541