四、Factory Method 模式
- 一、Factory Method 模式(将生成的实例交给子类)
- 二、示例程序
- 2.1 框架类 (framework包下的)
- 2.2 idCard
- 2.3 main
- 2.4 演示效果
- 三、原文链接查看以及源代码
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
代码语言:javascript复制package Factory.framework;
/**
* 声明产品的类,仅声明 use 方法,方法的实现交给子类负责
* 定义产品 ”任意是可以 use 的“
*/
public abstract class Product {
public abstract void use();
}
Factory
代码语言:javascript复制package Factory.framework;
/**
* 我们使用 Template Method 模式
* 声明:
* 1. 用于生成产品的 createProduct 抽象方法
* 2. 用于注册产品的 registerProduct 抽象方法
* 具体实现内容根据 Factory Method 适用的场景不同而不同,具体生成示例的时候一定会使用到 Template Method 模式
*/
public abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract void registerProduct(Product p);
protected abstract Product createProduct(String owner);
}
2.2 idCard
IDCard
代码语言:javascript复制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
代码语言:javascript复制package Factory.idcard;
import Factory.framework.Factory;
import Factory.framework.Product;
import java.util.*;
/**
* 实现了
* 1. createProduct() 通过 IDCard
* 2. 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
代码语言:javascript复制package Factory;
import Factory.framework.Factory;
import Factory.framework.Product;
import Factory.idcard.IDCardFactory;
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("小明");
Product card2 = factory.create("小张");
card1.use();
card2.use();
}
}
2.4 演示效果
三、原文链接查看以及源代码
原文链接 —— 以及其他系列文章整合 源代码