关键词:
抽象工厂
适合读者:
中级
摘要:
通过对抽象工厂的改造使变得简单和更具有扩展性。
内容:
首先我来分析一下抽象工厂模式:

我们为什么要这么设计呢?是因为我们有这样的要求:
老板:我要做一种产品。
程序员:我们没有考虑,直接做了一个产品类(ProductA1)和 产品线ProductFactory1。
老板:我还要再做另一种产品。
程序员:我们没有考虑,又做了一个产品类(ProductA2)。
老板:我还要再做另一种产品。
程序员:我们没有考虑,又做了一个产品类(ProductB1)。
老板:我还要再做另一种产品。
程序员:愤怒,又做了一个产品类(ProductB2)。
老板:使用中。。。
程序员:怕了他了,所以做了一个扩展, 抽象出来 AbstractProductA AbstractProductB。
老板:经过使用我们发现要新增我们的产品线来提高效率
程序员:没考虑,怎加了产品线ProductFactory2。
老板:经过我们的考虑两条产品线还是不能满足要求。
程序员:怕了他了,所以做了一个扩展 抽象出来AbstractFactory。
到现在我们看似完成了,其实是一团糟,让我们看看都做了什么,当我们产品类需要增加一个方法时,需要改写产品类的同时
要怎加产品线方法和产品线接口,更遭的是要增加产品线。依赖关系依然没有太大改善。
现在我们解决它:

实现:下面是一个接口的例子(我懒得改成抽象类,道理是一样的)。
能够应用这个的地方有很多,包括我举的这个例子,还可以重构一下 16 - 26 行的代码。
最后,这是我做项目中的一点小经验,夜里写的,有说的不对或没有讲清的或完全不对的请批评指教。谢谢。
抽象工厂
适合读者:
中级
摘要:
通过对抽象工厂的改造使变得简单和更具有扩展性。
内容:
首先我来分析一下抽象工厂模式:

我们为什么要这么设计呢?是因为我们有这样的要求:
老板:我要做一种产品。
程序员:我们没有考虑,直接做了一个产品类(ProductA1)和 产品线ProductFactory1。
老板:我还要再做另一种产品。
程序员:我们没有考虑,又做了一个产品类(ProductA2)。
老板:我还要再做另一种产品。
程序员:我们没有考虑,又做了一个产品类(ProductB1)。
老板:我还要再做另一种产品。
程序员:愤怒,又做了一个产品类(ProductB2)。
老板:使用中。。。
程序员:怕了他了,所以做了一个扩展, 抽象出来 AbstractProductA AbstractProductB。
老板:经过使用我们发现要新增我们的产品线来提高效率
程序员:没考虑,怎加了产品线ProductFactory2。
老板:经过我们的考虑两条产品线还是不能满足要求。
程序员:怕了他了,所以做了一个扩展 抽象出来AbstractFactory。
到现在我们看似完成了,其实是一团糟,让我们看看都做了什么,当我们产品类需要增加一个方法时,需要改写产品类的同时
要怎加产品线方法和产品线接口,更遭的是要增加产品线。依赖关系依然没有太大改善。
现在我们解决它:
实现:下面是一个接口的例子(我懒得改成抽象类,道理是一样的)。
1 public interface IFactory
2 {
3 object Create(string className);
4 }
5
6 public ProductFactory : IFactory
7 {
8 object CreateProduct(string className)
9 {
10 string path = "程序集";
11 return Assembly.Load(path).CreateInstance(path + "." + className);
12 }
13 }
14
15 // 注意 dll 可以根据需要做成一个或多个
16 public interface IProductA {}
17
18 public ProductA1 : IProductA {}
19
20 public ProductA2 : IProductA {}
21
22 public interface IProductB {}
23
24 public ProductB1 : IProductB {}
25
26 public ProductB2 : IProductB {}
27
28
29 main()
30 {
31 IFactory factory = new ProductFactory();
32 IProductA productA = (IProductA)factory.CreateProduct("类名");
33 }
2 {
3 object Create(string className);
4 }
5
6 public ProductFactory : IFactory
7 {
8 object CreateProduct(string className)
9 {
10 string path = "程序集";
11 return Assembly.Load(path).CreateInstance(path + "." + className);
12 }
13 }
14
15 // 注意 dll 可以根据需要做成一个或多个
16 public interface IProductA {}
17
18 public ProductA1 : IProductA {}
19
20 public ProductA2 : IProductA {}
21
22 public interface IProductB {}
23
24 public ProductB1 : IProductB {}
25
26 public ProductB2 : IProductB {}
27
28
29 main()
30 {
31 IFactory factory = new ProductFactory();
32 IProductA productA = (IProductA)factory.CreateProduct("类名");
33 }
能够应用这个的地方有很多,包括我举的这个例子,还可以重构一下 16 - 26 行的代码。
最后,这是我做项目中的一点小经验,夜里写的,有说的不对或没有讲清的或完全不对的请批评指教。谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端