工厂方法模式有一个缺点,他的一个工厂只能生产一种产品,我们就引入的产品族的概念,产品族就是把产品分类,
比如:
联想的电脑可能采用英特尔的CPU和希捷的硬盘
戴尔的笔记本可能采用AMD的CPU和西部数据的硬盘
抽象工厂的模式角色分析:
1. 抽象的各种产品族(产品接口)
2. 集成各种产品族的具体实现类(具体产品)
3. 能生产各种产品族的抽象工厂(工厂接口)
4. 能生产不同品牌产品族的具体工厂(工厂接口的实现类)
抽象工厂有以下的优势:
1. 定义了某一族产品的规范后,具体产品只要按照规范来生产就好
2. 工厂能生产多种产品,这节约了资源。(这样不会工厂类爆炸),虽然这有点不符合开闭和单一职责,但是防止了类的爆炸
但是会有以下的劣势:
1. 增加一个产品族,抽象工厂就要加一个抽象方法,具体工厂就要实现。违背了开闭原则。
2. 在具体工厂类的方法中,对于产品族里的产品,只能使用其中一个。这也比较容易理解,比如,一款车子不可以搭载两种空调。
代码实例:
CPU 抽象产品类 和 具体产品实现类
/** * 产品接口-CPU */ public interface Cpu { /** * 输出CPU信息 */ void calculate(); } /** * 英特尔CPU */ public class IntelCpu implements Cpu{ @Override public void calculate() { System.out.println("这是英特尔处理器。"); } } /** * AmdCPU */ public class AmdCpu implements Cpu { @Override public void calculate() { System.out.println("这是AMD处理器"); } }
硬盘抽象产品类 和 具体产品实现类
/** * 产品接口-硬盘 */ public interface HardDisk { /** * 输出硬盘信息 */ void calculate(); } /** * 希捷硬盘 */ public class Seagate implements HardDisk { @Override public void calculate() { System.out.println("这是希捷硬盘!"); } } /** * 西部数据硬盘 */ public class WesternData implements HardDisk { @Override public void calculate() { System.out.println("这是西部数据硬盘"); } }
抽象工厂类
/** * 电脑工厂类 */ public interface ComputerFactory { /** * 创建CPU * * @return */ Cpu createCpu(); /** * 创建硬盘 * * @return */ HardDisk createHardDisk(); }
生产不同品牌产品族的具体工厂
/** * 联想电脑创造工厂 */ public class LenovoFactory implements ComputerFactory { /** * 英特尔处理器 * * @return */ public Cpu createCpu() { return new IntelCpu(); } /** * 希捷硬盘 * * @return */ public HardDisk createHardDisk() { return new WesternData(); } } /** * 戴尔电脑-制造工厂 */ public class DellFactory implements ComputerFactory { /** * AMD处理器 * * @return */ public Cpu createCpu() { return new AmdCpu(); } /** * 希捷硬盘 * * @return */ public HardDisk createHardDisk() { return new WesternData(); } }
测试输出:
@SpringBootTest class ComputerFactoryTest { @Test public void test_01() { ComputerFactory lenovo = new LenovoFactory(); ComputerFactory dell = new DellFactory(); lenovo.createCpu().calculate(); lenovo.createHardDisk().calculate(); dell.createCpu().calculate();; dell.createHardDisk().calculate();; } }
这是英特尔处理器。
这是西部数据硬盘
这是AMD处理器
这是西部数据硬盘
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决