图解设计模式 - Factory Method 模式
程序员文章站
2022-06-15 11:31:00
...
读书笔记 仅供参考
Factory Method
将模板方法模式用于生产实例,就是工厂方法模式了。在 Factory Method 模式中,父类决定了实例的生成方式,但是并不决定所要生成的具体的类,具体的处理交给子类负责。
UML 和角色
Product
Product 是一个抽象类,定义了在模式中生成的实例所需要实现的接口,具体的处理由子类 ConcreteProduct 决定。
Creator
Creator 是负责生成 Product 角色的抽象类,具体的处理由子类决定。Creator 中的 create 方法相当于 Template Method 模式中的模型方法,实现了生成实例的过程,factoryMethod 则是需要子类实现的方法。
ConcreteProduct
ConcreteProduct 决定了具体的产品
ConcreteCreator
ConcreteCreator 负责生成具体的产品
例子
代码:
https://github.com/wujunyucg/DesignPattern/tree/master/src/chapter02/factoryMethod
Factory 类,相当于 Creator。
public abstract class Factory {
//定义了产品生产的流程
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
Product 类
public abstract class Product {
public abstract void use();
}
IDCardFactory 类,继承了 Factory 类,相当于 ConcreteCreator。
public class IDCardFactory extends Factory {
private List<String> owers = new ArrayList<>();
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(Product product) {
owers.add(((IDCard)product).getOwner());
}
public List<String> getOwers() {
return owers;
}
}
IDCard 类,继承了 Product 类,相当于 ConcreteProduct 。
public class IDCard extends Product {
private String owner;
public IDCard(String owner) {
System.out.println("制作" + owner + "的ID卡");
this.owner = owner;
}
@Override
public void use() {
System.out.println("使用" + owner + "的ID卡");
}
public String getOwner() {
return owner;
}
}
Main 类测试
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("小明");
Product card2 = factory.create("小红");
Product card3 = factory.create("小刚");
card1.use();
card2.use();
card3.use();
}
}
效果
UML
实现 createProduct 方法的三种方式
- 定义为抽象方法,子类必须实现
- 通过构造方法,但是不能再将超类定义为抽象类
- 在超类 create 方法抛出异常,子类如果不重写此方法,就会抛出异常,无法运行。
相关的设计模式
Template Method 模式
create 方法就是模板方法
Singleton 模式
可以将 Singleton 模式用于扮演 Creator 或 ConcreteCreaor 角色,在场景中不需要有多个 Creator。
Iterator 模式
在 Iterator 模式中生成 iterator 可以使用 Factory Method 模式。
Composite 模式
可以将 Composite 模式用于 Product 角色