设计模式三十六计之工厂方法(Factory Method)
解释:工厂方法模式是简单工厂模式的衍生,解决了简单工厂模式的破坏高内聚责任分配原则问题,完全实现了“开-闭”原则和可扩展,其核心创建一个产品对象的工厂接口,将具体的实例化操作推迟到产品子工厂中。工厂类不再负责实例化产品类,它仅仅负责具体子工厂类必须实现的接口。
1. 结构和原理
工厂方法模式是在简单工厂模式的基础上进行了抽象,它包含了一个抽象的Factory类,该类不再负责具体产品类的实例化,而只是负责定义产品生实例化的规范,具体的实例化工作交给子工厂类去完成。
2. 实现工厂方法模式
Product.java
public interface Product {
public String start();
}
Apple.java
public class Apple implements Product{
@Override
public String start() {
return "iPhone X start...";
}
}
Huawei.java
public class Huawei implements Product{
@Override
public String start() {
return "P20 Pro start...";
}
}
Factory.java
public abstract class Factory{
abstract public Product createMehod();
public Product doing(){
Product product = createMehod();
}
}
AppleFactory.java
public class AppleFactory extends Factory{
public Product createMehod(){
return new Apple();
}
}
HuaweiFactory.java
public class HuaweiFactory extends Factory{
public Product createMehod(){
return new HuaWei();
}
}
Customer.java
public class Customer {
public static void main(String[] args) {
AppleFactory appleFactory = new AppleFactory();
HuaweiFactory huaweiFactory = new HuaweiFactory();
Apple iPhoneX = appleFactory.createMehod();
Huawei P20Pro = huaweiFactory.createMehod();
System.out.println(iPhoneX.start());
System.out.println(P20Pro.start());
}
}
控制台输出:
iPhone X start...
P20 Pro start...
3. 总结
优点
- 符合开闭原则:新添加一种新产品时,只需要增加具体的产品类和相应的工厂子类
- 符合单一职责原则:每个工厂子类之负责创建对应的产品,工厂类只负责定义生成产品的规范
- 没有静态工厂方法:可实现扩展,体现了多态性。
缺点
- 一个工厂子类只能生产一种具体的产品
- 更换产品时,需要更换生产产品的具体工厂
- 实现的复杂度增加,系统总类的数量成对增加
适用场景
- 当一个类希望通过其子类来指定创建对象时
- 当一个类不需要知道它所需的对象的类时
- 将创建对象的任务委派给多个工厂子类中的一个来完成时
[原文链接:https://www.ramostear.com/articles/factory_method.html