23种设计模式(四) —— 手写实现 Factory Method 模式 (将具体交给子类)
Author: Gorit
Date:2021年1月
Refer:《图解设计模式》
2021年发表博文: 13/50
一、Factory Method 模式(将生成的实例交给子类)
==============================================================================================
该模式用于生成实例,Factory 是工厂,用 Template Method 模式来构建生成实例的工厂。
在这个模式中,父类决定实例的生成方式,但并不决定索要生成的具体的类,具体的处理全部交给子类来负责。
这样就可以将生成实例的框架(framework)和实际负责生成实例的类解耦
=====================================================================
这个示例程序的功能是制作身份证(ID卡),它其中有 5个类
| 类称 | 功能 |
| — | — |
| Product | 只定义抽象方法 use 的抽象类 |
| Factory | 实现了 create() 方法的抽象类 |
| IDCard | 实现了 use() 方法的类 |
| IDCardFactory | 实现了 createProduct、registerProduct 方法的类 |
| Main | 测试程序行为的类 |
2.1 框架类 (framework包下的)
Product
package Factory.framework;
/**
-
声明产品的类,仅声明 use 方法,方法的实现交给子类负责
-
定义产品 ”任意是可以 use 的“
*/
public abstract class Product {
public abstract void use();
}
Factory
package Factory.framework;
/**
-
我们使用 Template Method 模式
-
声明:
-
- 用于生成产品的 createProduct 抽象方法
-
- 用于注册产品的 registerProduct 抽象方法
-
具体实现内容根据 Factory Method 适用的场景不同而不同,具体生成示例的时候一定会使用到 Template Method 模式
*/
public abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct§;
return p;
}
protected abstract void registerProduct(Product p);
protected abstract Product createProduct(String owner);
}
2.2 idCard
IDCard
package Factory.idcard;
import Factory.framework.*;
/**
- 负责加工处理
*/
public class IDCard extends Product{
private String owner;
public IDCard(String owner) {
System.out.println(“制作”+owner +“的 ID 卡”);
this.owner = owner;
}
public void use() {
System.out.println(“使用” + owner + “的 ID 卡”);
}
public String getOwner() {
return owner;
}
}
IDCardFactory
package Factory.idcard;
import Factory.framework.Factory;
import Factory.framework.Product;
import java.util.*;
/**
-
实现了
-
- createProduct() 通过 IDCard
-
- reigisterProduct() 方法
*/
public class IDCardFactory extends Factory {
private List owners = new ArrayList();
protected Product createProduct(String owner) {
return new IDCard(owner);
}
protected void registerProduct(Product p) {
owners.add(((IDCard)p).getOwner());
}
public List getOwners() {
return owners;
}
}
2.3 main
package Factory;