23种设计模式(四) —— 手写实现 Factory Method 模式 (将具体交给子类)
2023-04-18 14:48:25 时间
四、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 模式
* 声明:
* 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
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.*;
/**
* 实现了
* 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
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 演示效果
三、原文链接查看以及源代码
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击