2025/9/18日 每日总结 设计模式实践:抽象工厂模式之"人种创建"案例解析
设计模式实践:抽象工厂模式之"人种创建"案例解析
在软件设计中,当需要创建一系列相互关联或依赖的产品对象时,抽象工厂模式是一个非常经典的解决方案。它能将产品的创建与使用分离,确保产品族的一致性,同时提高系统的灵活性和可扩展性。本文将通过"人种与肤色"的实践案例,详细拆解抽象工厂模式的实现过程与核心思想。
一、实验背景与需求
本次实践的核心需求是通过抽象工厂模式,构建一个支持多肤色(黄色、白色、黑色)、多性别(男性、女性)的人种创建系统。具体要求如下:
-
每种人种需具备肤色、语言、性别三个核心属性
-
同一性别工厂只能生产对应性别的人种(产品族一致性)
-
系统需支持灵活扩展新的人种或性别类型
-
客户端无需关注具体人种的创建细节,仅通过工厂接口调用
二、抽象工厂模式核心结构
抽象工厂模式的核心是定义抽象工厂接口和抽象产品接口,通过具体工厂实现类创建对应产品族的具体产品。本次案例的结构设计如下:
1. 核心组件划分
| 组件类型 | 具体实现 | 职责描述 |
|---|---|---|
| 抽象产品接口 | Human | 定义人种的通用行为(获取肤色、说话、获取性别) |
| 抽象产品类 | AbstractYellowHuman、AbstractWhiteHuman、AbstractBlackHuman | 实现对应肤色人种的通用行为(肤色、语言),抽象性别行为 |
| 具体产品类 | FemaleYellowHuman、MaleYellowHuman等6个类 | 实现具体性别对应的行为 |
| 抽象工厂接口 | HumanFactory | 定义创建各类人种的抽象方法 |
| 具体工厂类 | FemaleFactory、MaleFactory | 实现对应性别人种的创建逻辑 |
2. 类图结构
┌─────────────────┐
│ <<interface>> Human │
├─────────────────┤
│ + getColor(): void │
│ + talk(): void │
│ + getSex(): void │
└─────────────────┘
▲
│
┌─────────────────┬─────────────────┬─────────────────┐
│ AbstractYellowHuman │ AbstractWhiteHuman │ AbstractBlackHuman │
├─────────────────┤─────────────────┤─────────────────┤
│ + getColor() │ + getColor() │ + getColor() │
│ + talk() │ + talk() │ + talk() │
└─────────────────┘─────────────────┘─────────────────┘
▲ ▲ ▲
│ │ │
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│FemaleYellowHuman│ │MaleYellowHuman│ │...(其他具体类)...│
├───────────────┤ ├───────────────┤ ├───────────────┤
│ + getSex() │ │ + getSex() │ │ + getSex() │
└───────────────┘ └───────────────┘ └───────────────┘
┌─────────────────┐
│ <<interface>> HumanFactory │
├─────────────────┤
│ + createYellowHuman(): Human │
│ + createWhiteHuman(): Human │
│ + createBlackHuman(): Human │
└─────────────────┘
▲
│
┌─────────────────┬─────────────────┐
│ FemaleFactory │ MaleFactory │
├─────────────────┤─────────────────┤
│ + createYellowHuman() │
│ + createWhiteHuman() │
│ + createBlackHuman() │
└─────────────────┘─────────────────┘
三、完整实现代码
1. 抽象产品接口:Human.java
/**
* 人种接口,定义所有人种的通用行为
*/
public interface Human {
// 获取肤色
void getColor();
// 说话行为
void talk();
// 获取性别
void getSex();
}
### 2. 抽象产品类
#### 黄色人种抽象类:AbstractYellowHuman.java
```java
/**
* 黄色人种抽象类,实现黄色人种的通用特性
*/
public abstract class AbstractYellowHuman implements Human {
@Override
public void getColor() {
System.out.println("黄色人种的皮肤颜色是黄色的!");
}
@Override
public void talk() {
System.out.println("黄色人种会说话,一般说的都是双字节。");
}
}
白色人种抽象类:AbstractWhiteHuman.java
/**
* 白色人种抽象类,实现白色人种的通用特性
*/
public abstract class AbstractWhiteHuman implements Human {
@Override
public void getColor() {
System.out.println("白色人种的皮肤颜色是白色的!");
}
@Override
public void talk() {
System.out.println("白色人种会说话,一般说的都是单字节。");
}
}
黑色人种抽象类:AbstractBlackHuman.java
/**
* 黑色人种抽象类,实现黑色人种的通用特性
*/
public abstract class AbstractBlackHuman implements Human {
@Override
public void getColor() {
System.out.println("黑色人种的皮肤颜色是黑色的!");
}
@Override
public void talk() {
System.out.println("黑色人种会说话,一般人听不懂。");
}
}
3. 具体产品类
女性系列
// 黄色女性人种
public class FemaleYellowHuman extends AbstractYellowHuman {
@Override
public void getSex() {
System.out.println("黑色女性人种");
}
}
// 白色女性人种
public class FemaleWhiteHuman extends AbstractWhiteHuman {
@Override
public void getSex() {
System.out.println("白色女性人种");
}
}
// 黑色女性人种
public class FemaleBlackHuman extends AbstractBlackHuman {
@Override
public void getSex() {
System.out.println("黑色女性人种");
}
}
男性系列
// 黄色男性人种
public class MaleYellowHuman extends AbstractYellowHuman {
@Override
public void getSex() {
System.out.println("黄色男性人种");
}
}
// 白色男性人种
public class MaleWhiteHuman extends AbstractWhiteHuman {
@Override
public void getSex() {
System.out.println("白色男性人种");
}
}
// 黑色男性人种
public class MaleBlackHuman extends AbstractBlackHuman {
@Override
public void getSex() {
System.out.println("黑色男性人种");
}
}
4. 工厂接口与实现类
抽象工厂接口:HumanFactory.java
/**
* 人种工厂接口,定义创建各类人种的方法
*/
public interface HumanFactory {
// 制造黄色人种
Human createYellowHuman();
// 制造白色人种
Human createWhiteHuman();
// 制造黑色人种
Human createBlackHuman();
}
女性工厂:FemaleFactory.java
/**
* 女性人种工厂,专门生产女性系列人种
*/
public class FemaleFactory implements HumanFactory {
@Override
public Human createYellowHuman() {
return new FemaleYellowHuman();
}
@Override
public Human createWhiteHuman() {
return new FemaleWhiteHuman();
}
@Override
public Human createBlackHuman() {
return new FemaleBlackHuman();
}
}
男性工厂:MaleFactory.java
/**
* 男性人种工厂,专门生产男性系列人种
*/
public class MaleFactory implements HumanFactory {
@Override
public Human createYellowHuman() {
return new MaleYellowHuman();
}
@Override
public Human createWhiteHuman() {
return new MaleWhiteHuman();
}
@Override
public Human createBlackHuman() {
return new MaleBlackHuman();
}
}
5. 客户端测试类
/**
* 客户端测试:模拟人种创建与交互过程
*/
public class NvWa {
public static void main(String[] args) {
// 初始化两条生产线:男性工厂和女性工厂
HumanFactory maleFactory = new MaleFactory();
HumanFactory femaleFactory = new FemaleFactory();
// 生产女性人种
System.out.println("=== 开始生产女性人种 ===");
createAndShowHuman(femaleFactory.createYellowHuman(), "黄色女性");
createAndShowHuman(femaleFactory.createBlackHuman(), "黑色女性");
createAndShowHuman(femaleFactory.createWhiteHuman(), "白色女性");
// 生产男性人种
System.out.println("\n=== 开始生产男性人种 ===");
createAndShowHuman(maleFactory.createYellowHuman(), "黄色男性");
createAndShowHuman(maleFactory.createBlackHuman(), "黑色男性");
createAndShowHuman(maleFactory.createWhiteHuman(), "白色男性");
// 测试人种互动
System.out.println("\n=== 人种互动测试 ===");
Human femaleYellow = femaleFactory.createYellowHuman();
Human maleYellow = maleFactory.createYellowHuman();
testInteraction(femaleYellow, maleYellow);
}
// 创建并展示人种信息
private static void createAndShowHuman(Human human, String title) {
System.out.println("---生产一个" + title + "---");
human.getColor();
human.talk();
human.getSex();
}
// 测试两个人种的互动
private static void testInteraction(Human h1, Human h2) {
System.out.println("人种1信息:");
h1.getColor();
h1.getSex();
System.out.println("人种2信息:");
h2.getColor();
h2.getSex();
System.out.println("开始交流:");
h1.talk();
h2.talk();
}
}
四、运行结果
=== 开始生产女性人种 ===
---生产一个黄色女性---
黄色人种的皮肤颜色是黄色的!
黄色人种会说话,一般说的都是双字节。
黄色女性人种
---生产一个黑色女性---
黑色人种的皮肤颜色是黑色的!
黑色人种会说话,一般人听不懂。
黑色女性人种
---生产一个白色女性---
白色人种的皮肤颜色是白色的!
白色人种会说话,一般说的都是单字节。
白色女性人种
=== 开始生产男性人种 ===
---生产一个黄色男性---
黄色人种的皮肤颜色是黄色的!
黄色人种会说话,一般说的都是双字节。
黄色男性人种
---生产一个黑色男性---
黑色人种的皮肤颜色是黑色的!
黑色人种会说话,一般人听不懂。
黑色男性人种
---生产一个白色男性---
白色人种的皮肤颜色是白色的!
白色人种会说话,一般说的都是单字节。
白色男性人种
=== 人种互动测试 ===
人种1信息:
黄色人种的皮肤颜色是黄色的!
黄色女性人种
人种2信息:
黄色人种的皮肤颜色是黄色的!
黄色男性人种
开始交流:
黄色人种会说话,一般说的都是双字节。
黄色人种会说话,一般说的都是双字节。
五、抽象工厂模式核心优势
-
产品族一致性:同一工厂生产的产品属于同一产品族(如女性工厂只生产女性人种),避免了产品搭配错误
-
解耦创建与使用:客户端通过抽象接口操作产品,无需关注具体实现类,降低了耦合度
-
扩展性良好:新增人种(如棕色人种)只需添加对应的抽象产品类和具体产品类,扩展工厂接口即可,无需修改现有代码
-
切换灵活:更换产品族时,只需替换具体工厂实例,客户端代码无需改动
六、适用场景总结
抽象工厂模式特别适合以下场景:
- 系统需要创建一系列相互关联的产品(如本案例中的同性别不同肤色人种)
- 系统需要独立于产品的创建、组合和表示
- 系统需要配置多个产品系列中的一个,并能动态切换产品系列
- 强调一系列相关产品的一致性,需确保它们一起使用
通过本次实践,不仅深入理解了抽象工厂模式的结构和原理,更体会到了设计模式在解决复杂对象创建问题时的强大威力。在实际开发中,合理运用抽象工厂模式能显著提高系统的可维护性和扩展性。

浙公网安备 33010602011771号