您的位置:首页 > 其它

设计模式 - 工厂模式

2016-05-30 08:41 253 查看
工厂模式分为工厂方法模式和抽象工厂模式。

我们什么时候需要使用工厂模式?
对那些实现同一接口的类,我们可以创建一个工厂类,专门用于这些类的实例创建。

一、工厂方法模式 Factory Method
工厂方法模式有3种:普通工厂模式、多个工厂方法模式和静态工厂方法模式。

1、普通工厂模式

/** 1、 实现同一个接口 **/
public interface Sender {
public void send();
}
/** 2、多个实现类 **/
public class EmailSender implements Sender {
@override
public void send() {
<span style="white-space:pre">	</span>System.out.println(“Send Email.”);
}
}
public class SMSSender implements Sender {
@override
public void send() {
<span style="white-space:pre">	</span>System.out.println(“Send SMS.”);
}
}
/** 3、一个工厂类 **/
public class SendFactory {
public Sender produce(String type){
if(“Email”.equals(type)) {
<span style="white-space:pre">	</span>    return new EmailSender();
<span style="white-space:pre">	</span>} else if (“SMS”.equals(type)) {
<span style="white-space:pre">	</span>    return new SMSSender();
<span style="white-space:pre">	</span>} else {
<span style="white-space:pre">	</span>    System.out.println(“No such type!”);
<span style="white-space:pre">	</span>    return null;
}
}
}



2、多个工厂方法模式

多个工厂方法模式是对普通工厂模式的改进。

普通工厂模式中对象的创建始终在一个工厂方法中实现,而多个工厂方法模式提供多个工厂方法来创建对象。

public class SendFactory {
public Sender produceEmail() {
<span style="white-space:pre"> </span>return new EmailSender();
}
public Sender produceSMS() {
<span style="white-space:pre"> </span>return new SMSSender();
}
}

3、静态工厂方法模式

将多个工厂方法模式中的工厂方法都设置为静态,即不需要创建工厂类的实例就可以创建对象。

public class SendFactory {
public static Sender produceEmail() {
<span style="white-space:pre"> </span>return new EmailSender();
}
public static Sender produceSMS() {
<span style="white-space:pre"> </span>return new SMSSender();
}
}

二、抽象工厂模式 Abstract Factory

抽象工厂模式是对工厂方法模式的改进。

工厂方法模式的缺点:如果想拓展工厂类的功能,我们就必须修改工厂类,在其中添加新的工厂方法,这

显然违反了设计模式的开闭原则(拓展开放、修改关闭)。

抽象工厂模式通过创建多个工厂类,可以避免这个问题。当我们需要拓展功能时,只需要新增工厂类即可,

而不需要修改原工厂类的代码。

/** 1、实现同一个接口 **/
public interface Sender {
public void send();
}
/** 2、多个实现类 **/
public class EmailSender implements Sender {
@override
public void send() {
<span style="white-space:pre"> </span>System.out.println(“Send Email.”);
}
}
public class SMSSender implements Sender {
@override
public void send() {
<span style="white-space:pre"> </span>System.out.println(“Send SMS.”);
}
}
/** 3、创建多个工厂类 **/
public class SendEmialFactory implements Provider {
@override
public Sender produce() {
<span style="white-space:pre"> </span>return new EmailSender();
}
}
public class SMSEmialFactory implements Provider {
@override
public Sender produce() {
<span style="white-space:pre"> </span>return new SMSSender();
}
}
/** 4、提供对外接口 **/
public interface Provider {
public Sender produce();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: