您的位置:首页 > 编程语言 > Java开发

java23种常用设计模式之工厂方法模式(Factory Method)

2014-12-23 11:10 681 查看
最近真是所有时间都奉献给工作了,包括下班后,连续加了两个星期的班,都没时间写博客……

(借口!!!中午两个小时够写一篇啦!!!哈哈,我错了,是懒……)

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: