工厂方法模式
工厂方法模式的定义
-
定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
-
简称为工厂模式(Factory Pattern)
-
又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)
-
工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象
-
目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类
工厂方法模式的结构
-
Product(抽象产品)
-
ConcreteProduct(具体产品)
-
Factory(抽象工厂)
-
ConcreteFactory(具体工厂)
工厂方法模式的实现
-
抽象工厂类代码:
public interface Factory { public Product factoryMethod(); }
-
具体工厂类代码
public class ConcreteFactory implements Factory { public Product factoryMethod() { return new ConcreteProduct(); } }
-
客户端代码片段:
Factory factory; factory = new ConcreteFactory(); //可通过配置文件和反射机制实现 Product product; product = factory.factoryMethod();
结果与分析
-
在未使用配置文件和反射机制之前,更换具体工厂类需修改客户端源代码,但无须修改类库代码
Java反射机制
-
Java反射(Java Reflection)是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制,包括类的方法、属性、父类等信息,还包括实例的创建和实例类型的判断等
Class类的实例表示正在运行的Java应用程序中的类和接口,其forName(StringclassName)方法可以返回与带有给定字符串名的类或接口相关联的Class对象,再通过Class对象的newInstance()方法创建此对象所表示的类的一个新实例,即通过一个类名字符串得到类的实例
增加新产品的步骤
(1) 增加一个新的具体产品类作为抽象产品类的子类
(2) 增加一个新的具体工厂类作为抽象工厂类的子类,该工厂用于创建新增的具体产品对象
(3) 修改配置文件,用新的具体工厂类的类名字符串替换原有工厂类类名字符串
(4) 编译新增具体产品类和具体工厂类,运行客户端代码,即可完成新产品的增加和使用
模式优点
-
工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节
-
能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
-
在系统中加入新产品时,完全符合开闭原则
模式缺点
-
系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销
-
增加了系统的抽象性和理解难度
模式适用环境
-
客户端不知道它所需要的对象的类(客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建)
-
抽象工厂类通过其子类来指定创建哪个对象