工厂模式分为工厂方法模式和抽象工厂模式。
我们什么时候需要使用工厂模式?
对那些实现同一接口的类,我们可以创建一个工厂类,专门用于这些类的实例创建。
一、工厂方法模式 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();
}