工厂模式三部曲之三_抽象工厂模式(附三部曲源码)
抽象工厂模式是对工厂模式的进一步抽象,是工厂模式中最为抽象和最具一般性的一种形态,提供了创建一系列相关或者相互依赖对象的接口,而无需指定他们的类型。
如果你对工厂模式还有些迷惑的,可以回顾下工厂模式的内容:《工厂模式三部曲之二_工厂模式》 。
下面直接引用园中某位博友运用的实例进行讲解:
生活场景:某家具厂为学校生产课桌和座椅,开始只生产木质的课桌和座椅,后来经学校要求,又开始为学校生产铁质的课桌和座椅。
设计目标:实现针对多种成套产品的生产,每套产品有多种不同等级结构的物品组成。
【分析】
抽象产品:虚拟课桌 虚拟椅子
具体产品:木课桌 铁课桌;木椅子 铁椅子
抽象工厂:要生产产品的基类:抽象产品
具体工厂:木工厂=》木桌子,木椅子 铁工厂=》铁桌子,铁椅子
设计目标:实现针对多种成套产品的生产,每套产品有多种不同等级结构的物品组成。
【分析】
抽象产品:虚拟课桌 虚拟椅子
具体产品:木课桌 铁课桌;木椅子 铁椅子
抽象工厂:要生产产品的基类:抽象产品
具体工厂:木工厂=》木桌子,木椅子 铁工厂=》铁桌子,铁椅子
角色分析好了就直接进入代码部分:
抽象工厂类:

1 //抽象工厂:生产课桌 生产椅子
2 public abstract class Factory
3 {
4 public abstract Desk CreateDesk();
5 public abstract Chair CreateChair();
6 }
2 public abstract class Factory
3 {
4 public abstract Desk CreateDesk();
5 public abstract Chair CreateChair();
6 }
该类中定义了两个抽象方法,一个用来生产桌子,一个用来成产椅子
具体工厂类:

1 //具体工厂(木质产品工厂)
2 public class WoodFactory : Factory
3 {
4 //木桌子
5 public override Desk CreateDesk()
6 {
7 return new WoodDesk();
8 }
9
10 //木椅子
11 public override Chair CreateChair()
12 {
13 return new WoodChair();
14 }
15 }
16
17 //具体工厂(铁质产品工厂)
18 public class IronFactory : Factory
19 {
20 //铁桌子
21 public override Desk CreateDesk()
22 {
23 return new IronDesk();
24 }
25
26 //铁椅子
27 public override Chair CreateChair()
28 {
29 return new IronChair();
30 }
31 }
2 public class WoodFactory : Factory
3 {
4 //木桌子
5 public override Desk CreateDesk()
6 {
7 return new WoodDesk();
8 }
9
10 //木椅子
11 public override Chair CreateChair()
12 {
13 return new WoodChair();
14 }
15 }
16
17 //具体工厂(铁质产品工厂)
18 public class IronFactory : Factory
19 {
20 //铁桌子
21 public override Desk CreateDesk()
22 {
23 return new IronDesk();
24 }
25
26 //铁椅子
27 public override Chair CreateChair()
28 {
29 return new IronChair();
30 }
31 }
抽象工厂是用来生产一系列相关产品,这里的桌子分木桌子和铁桌子,这两种桌子就是相关产品,同理,木椅子和铁椅子也是相关产品,所以具体工厂分为了木制工厂和铁制工厂,分别用来生产木质产品和铁质产品,所以这里工厂重写了抽象工厂中的抽象方法,分别创建了某种材质的实例。
抽象产品类:

1 //抽象产品A:课桌
2 public abstract class Desk
3 {
4 public abstract void ProductDesk();
5 }
6 //抽象产品B:椅子
7 public abstract class Chair
8 {
9 public abstract void ProductChair();
10 }
2 public abstract class Desk
3 {
4 public abstract void ProductDesk();
5 }
6 //抽象产品B:椅子
7 public abstract class Chair
8 {
9 public abstract void ProductChair();
10 }
工厂模式是一个抽象工厂一个抽象产品,抽象工厂模式是多个抽象工厂多个抽象产品。
具体产品类:

1 //具体产品A_1:木课桌
2 public class WoodDesk : Desk
3 {
4 public override void ProductDesk()
5 {
6 Console.WriteLine("Wood Desk.......");
7 }
8 }
9
10 //具体产品A_2:铁课桌
11 public class IronDesk : Desk
12 {
13 public override void ProductDesk()
14 {
15 Console.WriteLine("Iron Desk.......");
16 }
17 }
18
19 //具体产品B_1:木椅子
20 public class WoodChair : Chair
21 {
22 public override void ProductChair()
23 {
24 Console.WriteLine("Wood Chair......");
25 }
26 }
27
28 //具体产品B_2:铁椅子
29 public class IronChair : Chair
30 {
31 public override void ProductChair()
32 {
33 Console.WriteLine("Iron Chair.......");
34 }
35 }
2 public class WoodDesk : Desk
3 {
4 public override void ProductDesk()
5 {
6 Console.WriteLine("Wood Desk.......");
7 }
8 }
9
10 //具体产品A_2:铁课桌
11 public class IronDesk : Desk
12 {
13 public override void ProductDesk()
14 {
15 Console.WriteLine("Iron Desk.......");
16 }
17 }
18
19 //具体产品B_1:木椅子
20 public class WoodChair : Chair
21 {
22 public override void ProductChair()
23 {
24 Console.WriteLine("Wood Chair......");
25 }
26 }
27
28 //具体产品B_2:铁椅子
29 public class IronChair : Chair
30 {
31 public override void ProductChair()
32 {
33 Console.WriteLine("Iron Chair.......");
34 }
35 }
具体产品分系列,有铁质系列和木质系列两种,产品分别是桌子椅子。
客户端:

1 //客户端
2 class Program
3 {
4 static void Main(string[] args)
5 {
6 //要求木桌子
7 Desk desk = new WoodFactory().CreateDesk();
8 desk.ProductDesk();
9
10 //要求铁椅子
11 Chair chair = new IronFactory().CreateChair();
12 chair.ProductChair();
13
14 Console.ReadKey();
15
16 }
17 }
2 class Program
3 {
4 static void Main(string[] args)
5 {
6 //要求木桌子
7 Desk desk = new WoodFactory().CreateDesk();
8 desk.ProductDesk();
9
10 //要求铁椅子
11 Chair chair = new IronFactory().CreateChair();
12 chair.ProductChair();
13
14 Console.ReadKey();
15
16 }
17 }
运行效果:
附上三部曲的所有源码:/Files/holyknight-zld/工厂模式/工厂模式三部曲.rar
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库