1.因为简单工厂模式设计增加功能时要修改工厂类,这不符合开闭原则所以要进行改进成为工厂方法模式
2.工厂方法模式的定义:
(1):定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类.
(2)工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象.目的是将产品的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体的产品类.
3.这里给出一工厂方法模式的UML类图
FactoryMethod1.png
4.分析工厂方法模式的结构
工厂方法模式包含以下4个角色:
(1)Product(抽象产品)
(2)ConcreteProduct(具体产品)
(3)Factory(抽象工厂)
(4)ConcreteFactory(具体工厂)
5.工厂方法模式代码实现
public interface Factory {
public Product factoryMethod();
}
public class ConcreteFactory implements Factory {
public Product factoryMethod() {
return new ConcreteProduct();
}
}
public class Client {
public static void main(String[] args) {
Factory factory;
//可通过配置文件和反射机制实现(我这里用的xml)
factory = new ConcreteFactory();
//这个抽象类我这里就没有附加代码,这个到这里应该看的懂
Product product;
//多态
product = factory.factoryMethod();
}
}
6.这里还有一个有意思的实例大家可以看一看
(1)题目:
某系统运行日志记录器(Logger)可以通过多种途径保存系统的运行日志,例如通过文件记录或数据库记录,用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时,开发人员发现需要对日志记录器进行一些初始化工作,初始化参数的设置过程较为复杂,而且某些参数的设置有严格的先后次序,否则可能会发生记录失败。
为了更好地封装记录器的初始化过程并保证多种记录器切换的灵活性,现使用工厂方法模式设计该系统。
(2)给UML类图代码就不提供了(可以模仿上面的代码来写)
FactoryMethod1.png
7.工厂方法模式的优缺点
(1)优点:
1.工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节
2.能够让工厂自主确定 创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
3.在系统中加入新产品时,完全符合开闭原则
(2)缺点:
1.系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销
2.增加了系统的抽象性和理解难度