创建型 - 工厂方法模式

目录
设计思想
定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类;从而能在不影响其他代码的情况下扩展对象的创建。
类图
代码实现
public class FactoryMethod {
interface Product {
void doStuff();
}
class ProductA implements Product {
@Override
void doStuff() {
System.out.println("ProductA doStuff.");
}
}
class ProductB implements Product {
@Override
void doStuff() {
System.out.println("ProductB doStuff.");
}
}
abstract class Factory {
public abstract Product createProduct();
}
class FactoryA extends Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
class FactoryB extends Factory {
@Override
public Product createProduct() {
return new ProductB();
}
}
public static void main(String[] args) {
Factory factory = new FactoryA();
Product product = factory.createProduct();
product.doStuff();
}
}
优缺点
优点:
- 符合单一职责原则;你可以将产品创建代码放在程序的单一位置,从而使得代码更容易维护。
- 符合开闭原则;无需更改现有客户端代码,你就可以在程序中引入新的产品类型。
缺点:
- 对于有多种分类的产品,或具有二级分类的产品,工厂方法模式并不适用。
适用场景
- 当你在编写代码的过程中,如果无法预知对象确切类别及其依赖关系时,可使用工厂方法。
- 所有产品具有相同的方法和类似的属性,使用者不关心具体的类型,只希望传入合适的参数能返回合适的对象。
- 如果你希望用户能扩展你软件库或框架的内部组件,可使用工厂方法。
继承可能是扩展软件库或框架默认行为的最简单方法;但是当你使用子类替代标准组件时,框架如何辨识出该子类?
解决方案是将各框架中构造组件的代码集中到单个工厂方法中,并在继承该组件之外允许任何人对该方法进行重写。