1. 定义
定义一个用于创建件对象的接口,让子类决定实例化那个类。工厂方法是一个类的实例化延迟到子类。
2. 使用场景
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂的对象适合使用工厂模式,用new就可创建的对象无需使用工厂模式。
3. 工厂模式代码
- 抽象产品类:
/**抽象产品类*/
public abstract class Product {
//抽象方法
public abstract void method1();
//抽象方法
public abstract void method2();
}
- 具体产品类ProductA:
/**具体产品类*/
public abstract class ProductA extend Product {
//具体事项方法
@Override
public void method1() {
//业务逻辑处理
}
//具体事项方法
@Override
public void method2() {
//业务逻辑处理
}
}
- 抽象工厂类:
/**负责自定义产品对象的产生
创建一个产品对象,其输入参数可以是任意对象,
一般为String Enum Class 等,当然也可以为空
*/
public abstract class AbstractProductFactory {
public abstract <T extends Product> T createProduct(Class<T> c);
}
- 具体工厂类:
public class ProductFactory extend AbstractProductFactory {
@Override
public <T extend Product> T createProduct(Class<T> c){
Product product = null;
try {
product = (Product) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return product;
}
}
5.应用代码:
AbstractProductFactory productFactory = new ProductFactory;
Product product = productFactory.createProduct(ProductA.class);
prodcut.method1();
product.method2();
4. 优缺点:
- 代码结构清晰,封装性好,只需要知道具体产品类的名字就可以创建该类;
- 扩张性优秀,在增加具体产品类的时候,不需要工厂类做任何的改变,就可以完成系统扩展;
- 工厂类与产品类完全解耦,产品类做任何的变化,都与工厂类无关;
5. 扩展
- 简单工厂模式
实现原理:去掉抽象工厂类AbstractProductFactory类,将具体工厂类的createProduct()方法设置为静态方法(添加static 关键字)
- 升级为多个工厂类
对每一个子类构建一个对应的ProductFactory工厂类,例如:ProductAFactory、ProductBFactory,去除通用的ProductFactory工厂类,每个子类的工厂类++只++生产对应的子类。
- 替代单例模式
- 延迟初始化
6.参考文献
- 《Android 源码设计模式》
- 《设计模式之禅》