1 介绍
工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
1.1 什么是工厂方法模式
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
1.2 解决了什么问题
我们明确地计划不同条件下创建不同实例时,工厂模式解决了接口选择的问题。
2 原理
在工厂方法模式中有如下角色:
- 抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;
- Creator为抽象创建类,也就是抽象工厂。
- ConcreteCreator,具体实现工厂。具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。
2.1 uml图
通用类图2.2 代码示例
Product代码示例
public abstract class Product {
//产品类的公共方法
public void method1(){
//业务逻辑处理
}
//抽象方法
public abstract void method2();
}
ConcreteProduct代码示例
public class ConcreteProduct1 extends Product {
public void method2() {
//业务逻辑处理
}
}
public class ConcreteProduct2 extends Product {
public void method2() {
//业务逻辑处理
}
}
Creator代码示例
public abstract class Creator {
/*
* 创建一个产品对象,其输入参数类型可以自行设置
* 通常为String、Enum、Class等,当然也可以为空
*/
public abstract T createProduct(Class c);
}
ConcreteCreator代码示例
public class ConcreteCreator extends Creator {
public T createProduct(Class c){
Product product=null;
try {
product = (Product)Class.forName(c.getName()).newInstance();
} catch (Exception e) {
//异常处理
}
return (T)product;
}
}
调用示例
public class Client {
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
Product product = creator.createProduct(ConcreteProduct1.class);
/*
* 继续业务处理
*/
}
}
2.3 优缺点
-
优点
- 良好的封装性,代码结构清晰。
- 工厂方法模式的扩展性非常优秀。
- 屏蔽产品类。
- 工厂方法模式是典型的解耦框架。
-
缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
3 适用场景
- 工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,增加代码的复杂度。
- 需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。万物皆对象,那万物也就皆产品类。比如:日志记录器。
- 工厂方法模式可以用在异构项目中,比如:数据库访问。再比如:设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
- 可以使用在测试驱动开发的框架下。
4 总结
作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
参考书籍及文章
1.《Java与模式》,电子工业出版社,阎宏
- 《大话设计模式》,清华大学出版社,程杰
- 《设计模式——可复用面向对象软件的基础》,机械工业出版社,Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides
- 《设计模式之禅》,https://www.kancloud.cn/sstd521/design/193522
网友评论