抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式。

目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法)。

使用场景:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

实现:在一个工厂里聚合多个同类产品。

案例

上一个工厂方法模式的案例是 一家生产电子产品的工厂,可以生产各种电子产品,但是这时候集团还拥有一家生产服装的工厂,

怎么能把这两个工厂给管理起来,其实把公产管理起来这样更加有助于去理解业务中的类的组织管理,不至于混乱不清晰。

  1. namespace DesignPatterns.AbstractFactory
  2. {
  3. /// <summary>
  4. /// 抽象工厂
  5. /// </summary>
  6. public abstract class AbstractFactory
  7. {
  8. public virtual ElectronicProduct GetElectronicProduct(string name)
  9. {
  10. throw new NullReferenceException();
  11. }
  12. public virtual CarProduct GetCarProduct(string name)
  13. {
  14. throw new NullReferenceException();
  15. }
  16. }
  17. /// <summary>
  18. /// 抽象工厂生成器,抽象工厂的调用入口
  19. /// </summary>
  20. public class FactoryProducer
  21. {
  22. /// <summary>
  23. /// 根据名称获取子类工厂的实例
  24. /// </summary>
  25. /// <param name="name"></param>
  26. /// <returns></returns>
  27. public static AbstractFactory GetFactory(string name)
  28. {
  29. if (name.ToLower() == "car")
  30. return new CarFactory();
  31. if (name.ToLower() == "electronic")
  32. return new ElectronicFactory();
  33. return null;
  34. }
  35. }
  36. #region 子类工厂 实现抽象工厂的方法
  37. public class CarFactory : AbstractFactory
  38. {
  39. public override CarProduct GetCarProduct(string name)
  40. {
  41. if (name.ToLower() == "motorbike")
  42. return new Motorbike();
  43. if (name.ToLower() == "xpandrally")
  44. return new XpandRally();
  45. throw new Exception("unknow product name");
  46. }
  47. }
  48. public class ElectronicFactory : AbstractFactory
  49. {
  50. public override ElectronicProduct GetElectronicProduct(string name)
  51. {
  52. if (name.ToLower() == "tv")
  53. return new TV();
  54. if (name.ToLower() == "mp4")
  55. return new MP4();
  56. if (name.ToLower() == "mp3")
  57. return new MP3();
  58. throw new Exception("unknow product name");
  59. }
  60. }
  61. #endregion
  62. #region 子类工厂的产品
  63. public abstract class CarProduct
  64. {
  65. public abstract void Run();
  66. }
  67. public class Motorbike : CarProduct
  68. {
  69. public override void Run()
  70. {
  71. Console.WriteLine("摩托车");
  72. }
  73. }
  74. public class XpandRally : CarProduct
  75. {
  76. public override void Run()
  77. {
  78. Console.WriteLine("拉力赛车");
  79. }
  80. }
  81. public abstract class ElectronicProduct
  82. {
  83. public abstract void Play();
  84. }
  85. public class TV : ElectronicProduct
  86. {
  87. public override void Play()
  88. {
  89. Console.WriteLine("TV play");
  90. }
  91. }
  92. public class MP4 : ElectronicProduct
  93. {
  94. public override void Play()
  95. {
  96. Console.WriteLine("MP4 play");
  97. }
  98. }
  99. public class MP3 : ElectronicProduct
  100. {
  101. public override void Play()
  102. {
  103. Console.WriteLine("MP3 play");
  104. }
  105. }
  106. #endregion
  107. public class AbstractFactoryTest
  108. {
  109. public static void Test()
  110. {
  111. //实例化造车工厂
  112. AbstractFactory carFactory = FactoryProducer.GetFactory("car");
  113. //获取摩托车实例
  114. var motorbike = carFactory.GetCarProduct("motorbike");
  115. //执行实例方法
  116. motorbike.Run();
  117. //实例化电子厂
  118. AbstractFactory electronicFactory = FactoryProducer.GetFactory("electronic");
  119. //获取tv实例
  120. var tv = electronicFactory.GetElectronicProduct("tv");
  121. tv.Play();
  122. }
  123. }
  124. }

Abstract Factory抽象工厂模式的更多相关文章

  1. c++ 设计模式9 (Abstract Factory 抽象工厂模式)

    5.2 抽象工厂模式 动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sq ...

  2. 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

    1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...

  3. Java设计模式:Abstract Factory(抽象工厂)模式

    概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...

  4. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

  5. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  6. Abstract Factory 抽象工厂模式

    提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...

  7. 2.设计模式-Abstract Factory 抽象工厂模式

    大神勿喷,不对的地方请指出来,学笔记而已. 解决的问题:应对多系列对象构建的变化或多系列(例如:崎岖的山路和平坦的马路属于一个系列) 不断的变化的创建. 使用场景:对象不变(比如有3个对象 " ...

  8. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  9. Abstract Factory 抽象工厂(创建型模式)

    1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...

随机推荐

  1. Myeclipse8.5上基于JAX-WS开发WebService

    1.JAX-WS介绍 JAX-WS规范是一组XML web services的JAVA API. 2.开发步骤 基于JAX-WS的WebService开发步骤如下: 2.1 新建一个Web Servi ...

  2. 码农"混子"的思想转变

    首先介绍一下自己,在高中的时候学校对于我们这种普通班级采取的都是放养状态,所以高中的学习真是不咋地,可能除了自己擅长的数学以外其他也就考个三四十分,后来磕磕绊绊的在打游戏之余也会学习,第一次参加高考跟 ...

  3. Java源码之ConcurrentHashMap

    ⑴背景 ConcurrentHashMap是线程安全高效的HashMap.而HashMap在多线程情况下强行使用HashMap的put方法可能会导致程序死循环,使CPU使用率达到100%.(http: ...

  4. Lasso估计学习笔记(二)

    先看Lasso估计学习笔记(一),这篇是续的上一篇

  5. (三十九)c#Winform自定义控件-面包屑导航

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  6. 从0到1发布一个npm包

    从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...

  7. 2018年蓝桥杯b组国赛真题

    1.标题:换零钞x星球的钞票的面额只有:100元,5元,2元,1元,共4种.小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱.小明有点强迫症,他坚持要求200元换出 ...

  8. win server 2008搭建域环境

    0x00 简介 1.域控:win server 2008 2.域内服务器:win server 2008.win server 2003 3.域内PC:win7 x64.win7 x32.win xp ...

  9. 启xin宝app的token算法破解——token分析篇(三)

    前两篇文章分析该APP的抓包.的逆向: 启xin宝app的token算法破解--抓包分析篇(一) 启xin宝app的token算法破解--逆向篇(二) 本篇就将对token静态分析,其实很简单就可以搞 ...

  10. Codeforces 936C

    题意略. 思路: 这个题目没做出来是因为缺少一个整体的构造思路. 正确的构造思路是不断地在s中去构造并且扩大t的后缀,构造好的后缀总是放在前面,然后不断地把它往后挤,最后将s构造成t. 比如: 现在在 ...