抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象。本文采取的仍然是接着以前的那个快餐店的例子。现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食习惯,创建了两大系列(相当于产品族)快餐,北方系列和南方系列。每个系列分别由一个大厨掌勺。抽象工厂模式对新的产品族支持开闭原则,但对新的产品不支持开闭原则。例如增加新的产品族,如增加美国系列快餐(相当于增加了一个产品族),则只要从每个产品接口继承一个相应美国系列产品即可,不需要更改已有的代码。但如果增加新产品,比如增加了“馒头”这个产品,则它是不支持开闭原则的,因为你要在厨师接口中,增加返回“馒头”的方法,这就要修改已存在的接口,而修改了上层接口,继承此接口的具体类也要随之改变。

使用抽象工厂模式的条件:
1 一个系统不应依赖于产品如何被创建,组合和表达的细节。
2 有多个产品族,而系统只消费其中一个族中的产品
3 同属于一个产品族的产品是在一起使用的。
4 系统提供一个产品的库,所有产品都是以同样的接口实现。

看下面的C#实现:

  1. /// <summary>
  2. /// 抽象工厂模式示例
  3. /// </summary>
  4. class AbstractFactory
  5. {
  6. //定义厨师的抽象工厂
  7. public interface Chef
  8. {
  9. //这里定义厨师的公共操作
  10. //返回抽象面条
  11. Noodle MakeNoodle();
  12. //返回抽象米饭
  13. Rice MakeRice();
  14. //返回抽象面包
  15. Bread MakeBread();
  16. }
  17.  
  18. //定义北方厨师,实现厨师接口
  19. class NorthChef : Chef
  20. {
  21. public Noodle MakeNoodle()
  22. {
  23. Console.WriteLine("\n制作北方面条...");
  24. Noodle noodle = new NorthNoodle();
  25. return noodle;
  26. }
  27. public Rice MakeRice()
  28. {
  29. Console.WriteLine("\n制作北方米饭...");
  30. Rice rice = new NorthRice();
  31. return rice;
  32. }
  33. public Bread MakeBread()
  34. {
  35. Console.WriteLine("\n正在制作北方面包..");
  36. Bread bread = new NorthBread(); return bread;
  37. }
  38. }
  39. //定义南方厨师,实现厨师接口
  40. class SouthChef : Chef
  41. {
  42. public Noodle MakeNoodle()
  43. {
  44. Console.WriteLine("\n正在制作南方面条。。。");
  45. Noodle noodle = new SouthNoodle();
  46. return noodle;
  47. }
  48. public Rice MakeRice()
  49. {
  50. Console.WriteLine("\n正在制作南方米饭。。。");
  51. Rice rice = new SouthRice();
  52. return rice;
  53. }
  54. public Bread MakeBread()
  55. {
  56. Console.WriteLine("\n正在制作南方面包。。。");
  57. Bread bread = new SouthBread();
  58. return bread;
  59. }
  60. }
  61.  
  62. //定义面条产品
  63. public interface Noodle
  64. {
  65. //这里定义面条的公共操作
  66. }
  67. class NorthNoodle : Noodle
  68. {
  69. public NorthNoodle()
  70. {
  71. Console.WriteLine("\n一碗地道的北方面条产生了");
  72. }
  73. }
  74. class SouthNoodle : Noodle
  75. {
  76. public SouthNoodle()
  77. {
  78. Console.WriteLine("\n一碗地道的南方面条产生了");
  79. }
  80. }
  81. //定义米饭产品
  82. public interface Rice
  83. {
  84. //这里定义米饭的公共操作
  85. }
  86. class NorthRice : Rice
  87. {
  88. public NorthRice()
  89. {
  90. Console.WriteLine("\n一碗地道的北方米饭产生了,真好吃");
  91. }
  92. }
  93. class SouthRice : Rice
  94. {
  95. public SouthRice()
  96. {
  97. Console.WriteLine("\n一碗地道的南方米饭产生了,真难吃");
  98. }
  99. }
  100. //定义面包
  101. public interface Bread
  102. {
  103. //这里可以定义一些面包的公共操作
  104. }
  105. class NorthBread : Bread
  106. {
  107. public NorthBread()
  108. {
  109. Console.WriteLine("\n一个地道的北方面包产生了");
  110. }
  111. }
  112. class SouthBread : Bread
  113. {
  114. public SouthBread()
  115. {
  116. Console.WriteLine("\n一个地道的南方面包产生了");
  117. }
  118. }
  119. }

应用程序的实现:

  1. /// <summary>
  2. /// 应用程序的主入口点。
  3. /// </summary>
  4. [STAThread]
  5. static void Main(string[] args)
  6. {
  7. //针对接口编程,创建对象尽量返回上层接口,避免使用具体类
  8. //下面隐藏了具体的创建各种面条,米饭和面包的过程
  9. Chef northChef=new NorthChef();
  10. northChef.MakeNoodle();
  11. northChef.MakeRice();
  12. northChef.MakeBread();
  13. Chef southChef=new SouthChef();
  14. southChef.MakeBread();
  15. southChef.MakeNoodle();
  16. southChef.MakeRice();
  17. Console.ReadLine();
  18. }

其实就这样!
抽象工厂产生实体工厂,实体工厂生产实体产品,而实体产品又属于抽象产品!
最终直接面向客户的是抽象工厂和抽象产品

简单理解C#中的抽象工厂模式是什么概念!的更多相关文章

  1. java之设计模式工厂三兄弟之抽象工厂模式

    [学习难度:★★★★☆,使用频率:★★★★★]  工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...

  2. 《JAVA与模式》之抽象工厂模式

    场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...

  3. [Python设计模式] 第15章 如何兼容各种DB——抽象工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): ...

  4. Java设计模式-抽象工厂模式(Abstarct Factory)

    抽象工厂模式 举个生活中常见的例子,组装电脑,在组装电脑时,通常需要选择一系列的配件,比如CPU,硬盘,内存,主板,电源,机箱等,为了讨论使用简单,值考虑选择CPU和主板的问题. 事实上,在选择CPU ...

  5. 《Java设计模式》之抽象工厂模式

    场景问题 举个生活中常见的样例--组装电脑.我们在组装电脑的时候.通常须要选择一系列的配件,比方CPU.硬盘.内存.主板.电源.机箱等. 为讨论使用简单点.仅仅考虑选择CPU和主板的问题. 其实,在选 ...

  6. 《JAVA设计模式》之抽象工厂模式(Abstract Factory)

    场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...

  7. .NET抽象工厂模式微理解--教你在项目中实现抽象工厂

    .NET抽象工厂模式微理解--教你在项目中实现抽象工厂 最近在学习MVC,对于MVC里面的一些项目上的东西都和抽象模式有关,今天就微说明一下个人对于抽象工厂模式的理解,以方便学习MVC及工厂模式相关的 ...

  8. 结合实例分析简单工厂模式&工厂方法模式&抽象工厂模式的区别

    之前写过一篇关于工厂模式(Factory Pattern)的随笔,里面分析了简单工厂模式,但对于工厂方法和抽象工厂的分析较为简略.这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个 ...

  9. .Net简单工厂模式,工厂模式,抽象工厂模式实例

    1.定义   简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂模式:定义一个用于创建对象的接口, ...

随机推荐

  1. python super()继承和多继承

    class A: def __init__(self): self.n = 2 def add(self, m): print('self is {} @A.add'.format(self)) se ...

  2. 51nod1238. 最小公倍数之和 V3(数论)

    题目链接 https://www.51nod.com/Challenge/Problem.html#!#problemId=1238 题解 本来想做个杜教筛板子题结果用另一种方法过了...... 所谓 ...

  3. kamctl start

    尽管没有吃饭,胃酸,九点半,,,还是挺高兴的.只截图不说话. 这个问题弄得我好烦啊.几个小时...网罗了国外几个论坛都没有解.我还没有想到这就不是问题,,,多试多试 再看看moni 也没什么意思,就是 ...

  4. Ubuntu16.04+Cuda8.0+cuDNN6配置py-faster rcnn(转)

    原博客地址:https://blog.csdn.net/meccaendless/article/details/79557162 0前言Faster R-CNN是任少卿2015年底推出的目标检测算法 ...

  5. ngx_echo_module

    https://github.com/openresty/echo-nginx-module echo $echo_request_body

  6. activeMQ入门+spring boot整合activeMQ

    最近想要学习MOM(消息中间件:Message Oriented Middleware),就从比较基础的activeMQ学起,rabbitMQ.zeroMQ.rocketMQ.Kafka等后续再去学习 ...

  7. jsp、Servlet的面试题

    3. 谈谈Servlet的生命周期 当接收到请求的时候,容器察看对应的Servlet对象是否存在,如果不存在,需要加载Servetl,实例化Servlet,调用init方法进行初始化.如果已经存在,根 ...

  8. MySQL修改提示符

    MySQL提示符 \D 完整日期 \d 当前数据库 \h 服务器名称 \u 当前用户 1.连接之前修改提示符 mysql -uroot -proot --prompt [MySQL提示符] 2.连接之 ...

  9. C#利用WebBrowser获取完整COOKIE

    代码: http://www.cnblogs.com/hsapphire/archive/2010/09/10/1823384.html http://blog.csdn.net/attilax/ar ...

  10. redis在Linux上的安装

    1 安装redis编译的c环境 输入命令: 注意yum安装必须联网 yum install gcc-c++  如果提示是否需要下载输入y就可以开始下载. 2 redis安装 1 上传文件 2 解压文件 ...