定义
简单工厂模式 不符合开闭原则,添加新的产品时,必须修改工厂类。由此改进 工厂方法模式。
- 工厂方法模式(Factory Method Pattern)简称工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。
- 在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
结构
分析
- 工厂方法模式是简单工厂模式的进一步抽象和推广
- 工厂方法模式保持了简单工厂模式的优点,并克服了它的缺点
- 核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给其子类工厂去完成
- 可以允许系统在不修改工厂角色的情况下引进新产品
- 增加具体产品–>增加具体工厂,符合“开闭原则”
优点
- 工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节
- 能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
- 在系统中加入新产品时,完全符合开闭原则
缺点
- 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销
- 增加了系统的抽象性和理解难度
示例代码
package hw1.q2;
public interface Connection {
void connection();
}
package hw1.q2;
public interface ConnectionFactory {
Connection produceConnection();
}
package hw1.q2;
public class HTTPConnection implements Connection{
@Override
public void connection() {
System.out.println("HTTPConnection的connection方法");
}
}
package hw1.q2;
public class HTTPConnectionFactory implements ConnectionFactory {
@Override
public Connection produceConnection() {
System.out.println("正在创建HTTPConnection");
return new HTTPConnection();
}
}
package hw1.q2;
public class IMAPConnection implements Connection{
@Override
public void connection() {
System.out.println("IMAPConnection的connection方法");
}
}
package hw1.q2;
public class IMAPConnectionFactory implements ConnectionFactory {
@Override
public Connection produceConnection() {
System.out.println("正在创建IMAPConnection");
return new IMAPConnection();
}
}
package hw1.q2;
public class POP3Connection implements Connection{
@Override
public void connection() {
System.out.println("POP3Connection的connection方法");
}
}
package hw1.q2;
public class POP3ConnectionFactory implements ConnectionFactory {
@Override
public Connection produceConnection() {
System.out.println("正在创建POP3Connection");
return new POP3Connection();
}
}
package hw1.q2;
public class Client {
public static void main(String[] args) {
HTTPConnectionFactory hcf = new HTTPConnectionFactory();
HTTPConnection httpConnection = (HTTPConnection)hcf.produceConnection();
httpConnection.connection();
}
}
增加POP3时,无需修改源代码,符合开闭原则。