当前位置: 首页 > news >正文

2025/9/18日 每日总结 设计模式实践:抽象工厂模式之人种创建案例解析

设计模式实践:抽象工厂模式之"人种创建"案例解析

在软件设计中,当需要创建一系列相互关联或依赖的产品对象时,抽象工厂模式是一个非常经典的解决方案。它能将产品的创建与使用分离,确保产品族的一致性,同时提高系统的灵活性和可扩展性。本文将通过"人种与肤色"的实践案例,详细拆解抽象工厂模式的实现过程与核心思想。

一、实验背景与需求

本次实践的核心需求是通过抽象工厂模式,构建一个支持多肤色(黄色、白色、黑色)、多性别(男性、女性)的人种创建系统。具体要求如下:

  1. 每种人种需具备肤色、语言、性别三个核心属性

  2. 同一性别工厂只能生产对应性别的人种(产品族一致性)

  3. 系统需支持灵活扩展新的人种或性别类型

  4. 客户端无需关注具体人种的创建细节,仅通过工厂接口调用

二、抽象工厂模式核心结构

抽象工厂模式的核心是定义抽象工厂接口和抽象产品接口,通过具体工厂实现类创建对应产品族的具体产品。本次案例的结构设计如下:

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 {@Overridepublic void getColor() {System.out.println("黄色人种的皮肤颜色是黄色的!");}@Overridepublic void talk() {System.out.println("黄色人种会说话,一般说的都是双字节。");}
}

白色人种抽象类:AbstractWhiteHuman.java

/*** 白色人种抽象类,实现白色人种的通用特性*/
public abstract class AbstractWhiteHuman implements Human {@Overridepublic void getColor() {System.out.println("白色人种的皮肤颜色是白色的!");}@Overridepublic void talk() {System.out.println("白色人种会说话,一般说的都是单字节。");}
}

黑色人种抽象类:AbstractBlackHuman.java

/*** 黑色人种抽象类,实现黑色人种的通用特性*/
public abstract class AbstractBlackHuman implements Human {@Overridepublic void getColor() {System.out.println("黑色人种的皮肤颜色是黑色的!");}@Overridepublic void talk() {System.out.println("黑色人种会说话,一般人听不懂。");}
}

3. 具体产品类

女性系列

// 黄色女性人种
public class FemaleYellowHuman extends AbstractYellowHuman {@Overridepublic void getSex() {System.out.println("黑色女性人种");}
}
// 白色女性人种
public class FemaleWhiteHuman extends AbstractWhiteHuman {@Overridepublic void getSex() {System.out.println("白色女性人种");}
}
// 黑色女性人种
public class FemaleBlackHuman extends AbstractBlackHuman {@Overridepublic void getSex() {System.out.println("黑色女性人种");}
}

男性系列

// 黄色男性人种
public class MaleYellowHuman extends AbstractYellowHuman {@Overridepublic void getSex() {System.out.println("黄色男性人种");}
}
// 白色男性人种
public class MaleWhiteHuman extends AbstractWhiteHuman {@Overridepublic void getSex() {System.out.println("白色男性人种");}
}
// 黑色男性人种
public class MaleBlackHuman extends AbstractBlackHuman {@Overridepublic void getSex() {System.out.println("黑色男性人种");}
}

4. 工厂接口与实现类

抽象工厂接口:HumanFactory.java

/*** 人种工厂接口,定义创建各类人种的方法*/
public interface HumanFactory {// 制造黄色人种Human createYellowHuman();// 制造白色人种Human createWhiteHuman();// 制造黑色人种Human createBlackHuman();
}

女性工厂:FemaleFactory.java

/*** 女性人种工厂,专门生产女性系列人种*/
public class FemaleFactory implements HumanFactory {@Overridepublic Human createYellowHuman() {return new FemaleYellowHuman();}@Overridepublic Human createWhiteHuman() {return new FemaleWhiteHuman();}@Overridepublic Human createBlackHuman() {return new FemaleBlackHuman();}
}

男性工厂:MaleFactory.java

/*** 男性人种工厂,专门生产男性系列人种*/
public class MaleFactory implements HumanFactory {@Overridepublic Human createYellowHuman() {return new MaleYellowHuman();}@Overridepublic Human createWhiteHuman() {return new MaleWhiteHuman();}@Overridepublic 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信息:
黄色人种的皮肤颜色是黄色的!
黄色男性人种
开始交流:
黄色人种会说话,一般说的都是双字节。
黄色人种会说话,一般说的都是双字节。

五、抽象工厂模式核心优势

  1. 产品族一致性:同一工厂生产的产品属于同一产品族(如女性工厂只生产女性人种),避免了产品搭配错误

  2. 解耦创建与使用:客户端通过抽象接口操作产品,无需关注具体实现类,降低了耦合度

  3. 扩展性良好:新增人种(如棕色人种)只需添加对应的抽象产品类和具体产品类,扩展工厂接口即可,无需修改现有代码

  4. 切换灵活:更换产品族时,只需替换具体工厂实例,客户端代码无需改动

六、适用场景总结

抽象工厂模式特别适合以下场景:

  • 系统需要创建一系列相互关联的产品(如本案例中的同性别不同肤色人种)
  • 系统需要独立于产品的创建、组合和表示
  • 系统需要配置多个产品系列中的一个,并能动态切换产品系列
  • 强调一系列相关产品的一致性,需确保它们一起使用
    通过本次实践,不仅深入理解了抽象工厂模式的结构和原理,更体会到了设计模式在解决复杂对象创建问题时的强大威力。在实际开发中,合理运用抽象工厂模式能显著提高系统的可维护性和扩展性。
http://www.gsyq.cn/news/175236.html

相关文章:

  • Cookie Session Token的区别
  • ICLR史无前例!中国团队站上C位,全球AI顶会首次为它设专场
  • PyTorch-CUDA-v2.7镜像内置nbconvert,轻松转换notebook为html/pdf
  • AI视觉模型训练-Teachable Machine
  • 当 Paperzz 开题报告撞上 “无痛毕业”:从熬夜改框架到 10 分钟出 PPT 的降维打击
  • 2025年质量好的防火堵料公司推荐,正规供应商排名与专业解析 - 工业品网
  • Anaconda换源仍慢?直接采用PyTorch-CUDA-v2.7国内镜像
  • 在GCP实例中检测与缓解CVE-2024-6387漏洞:第一部分
  • SSH隧道转发:安全访问远程PyTorch-CUDA-v2.7开发环境
  • 基于FPGA的特定序列检测器verilog实现,包含testbench和开发板硬件测试
  • 2026年求婚钻戒推荐:价值观驱动下的五大选择 - 品牌企业推荐师(官方)
  • PyTorch-CUDA-v2.7镜像支持NVIDIA A10G,适合云上部署
  • 12月26日,历经近10年系统性修缮的养心殿再度揭开神秘面纱,这里是封建时代皇权的中心,曾经发生过很多影响中国历史的重大事件!
  • 突发:台湾附近发生6.6级地震,福州、泉州等地震感强烈
  • Anaconda配置PyTorch环境踩坑总结,不如直接用v2.7镜像
  • 2025年口碑好的少儿编程项目哪家靠谱 - 行业平台推荐
  • 上海装修公司十大排名推荐,2025实测精选多家对比 - 速递信息
  • 权威测评|继电保护测试仪品牌、品质、售后、性价比全解析 - 品牌推荐大师1
  • 2025年智能运维平台选型指南:四大主流厂商深度解析与推荐
  • 带你体验月入过万网络安全工程的一天!
  • msjet40.dll文件丢失损坏找不到 打不开程序软件问题 下载方法
  • 超越工具思维:数据管理部门如何借AI实现战略升维
  • 2026年GEO优化服务商深度评测:TOP服务商全方位对比 - AIDSO爱搜
  • 图片二维码是如何制作的?图片生成二维码技巧
  • 2026年GEO贴牌代理的市场规模有多大? - 源码云科技
  • leetcode 807. 保持城市天际线-耗时100%
  • 基于SVPWM和Park变换的异步电机转速控制系统simulink建模与仿真
  • win11安装麒麟arm64服务器系统
  • Java:Jenkins
  • 直流电阻测试仪生产厂家全攻略:国内制造商、供应商、生产商优选指南 - 品牌推荐大师1