• 创建型模式 - 抽象工厂模式AbstractFactory


    学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

    模式的定义与特点

            抽象工厂模式、是一种为访问类提供一个创建一组相关或相关一类对象的接口,且访问类无需指定所要的产品的具体类,就能得到同族的不同等级的产品的模式结构。

            抽象工厂模式工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。  

    使用抽象工厂模式,一般要满足以下条件:

    • 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
    • 系统一次只可能消费其中某一族产品,即同族的产品一起使用。

    抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。

    • 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
    • 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
    • 抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。

    抽象工厂模式的缺点

    • 当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度

    模式的结构与实现

            抽象工厂模式工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。现在我们来分析其基本结构和实现方法。  

    1. 模式的结构

    抽象工厂模式的主要角色如下。

    • 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
    • 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
    • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
    • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

    模式的应用场景

    抽象工厂模式通常适用于以下场景:

    • 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
    • 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
    • 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。

    抽象工厂模式的结构图如图 2 所示。

     举例代码:

    1. namespace StudyDesignMode.AbstractFactory
    2. {
    3. public interface IProductFactory
    4. {
    5. IPhoneProduct iphoneProduct();
    6. IRouterProduct routerProduct();
    7. }
    8. }
    9. namespace StudyDesignMode.AbstractFactory
    10. {
    11. public interface IPhoneProduct
    12. {
    13. void Start();
    14. void Shutdown();
    15. void CallUp();
    16. void SendSMS();
    17. }
    18. }
    19. namespace StudyDesignMode.AbstractFactory
    20. {
    21. public interface IRouterProduct
    22. {
    23. void Start();
    24. void Shutdown();
    25. void OpenWife();
    26. void Setting();
    27. }
    28. }
    29. //AbstractFactory中
    30. namespace StudyDesignMode.AbstractFactory
    31. {
    32. public class XiaomiPhone : IPhoneProduct
    33. {
    34. public void CallUp(){ Console.WriteLine("Xiaomi CallUp"); }
    35. public void SendSMS(){ Console.WriteLine("Xiaomi SendSMS"); }
    36. public void Shutdown(){ Console.WriteLine("Xiaomi Shutdown"); }
    37. public void Start(){ Console.WriteLine("Xiaomi Start"); }
    38. }
    39. public class HuaweiPhone : IPhoneProduct
    40. {
    41. public void CallUp() { Console.WriteLine("Huawei CallUp"); }
    42. public void SendSMS() { Console.WriteLine("Huawei SendSMS"); }
    43. public void Shutdown() { Console.WriteLine("Huawei Shutdown"); }
    44. public void Start() { Console.WriteLine("Huawei Start"); }
    45. }
    46. public class XiaomiRouter : IRouterProduct
    47. {
    48. public void OpenWife(){ Console.WriteLine("Xiaomi OpenWife"); }
    49. public void Setting(){Console.WriteLine("Xiaomi Setting");}
    50. public void Shutdown(){ Console.WriteLine("Xiaomi Shutdown"); }
    51. public void Start(){ Console.WriteLine("Xiaomi Start"); }
    52. }
    53. public class HuaweiRouter : IRouterProduct
    54. {
    55. public void OpenWife() { Console.WriteLine("Huawei OpenWife"); }
    56. public void Setting() { Console.WriteLine("Huawei Setting"); }
    57. public void Shutdown() { Console.WriteLine("Huawei Shutdown"); }
    58. public void Start() { Console.WriteLine("Huawei Start"); }
    59. }
    60. }
    61. namespace StudyDesignMode.AbstractFactory
    62. {
    63. public class XiaomiFactory : IProductFactory
    64. {
    65. public IPhoneProduct iphoneProduct()
    66. {
    67. return new XiaomiPhone();
    68. }
    69. public IRouterProduct routerProduct()
    70. {
    71. return new XiaomiRouter();
    72. }
    73. }
    74. }
    75. namespace StudyDesignMode.AbstractFactory
    76. {
    77. public class HuaweiFactory : IProductFactory
    78. {
    79. public IPhoneProduct iphoneProduct()
    80. {
    81. return new HuaweiPhone();
    82. }
    83. public IRouterProduct routerProduct()
    84. {
    85. return new HuaweiRouter();
    86. }
    87. }
    88. }
    89. //客户端代码
    90. #region Abstract Factory
    91. public static void AbstractFactoryTest()
    92. {
    93. XiaomiFactory xiaomiFactory = new XiaomiFactory();
    94. IPhoneProduct xiaomiPhone = xiaomiFactory.iphoneProduct();
    95. IRouterProduct xiaomiRouter = xiaomiFactory.routerProduct();
    96. xiaomiPhone.Start();
    97. xiaomiPhone.CallUp();
    98. xiaomiPhone.Shutdown();
    99. xiaomiPhone.SendSMS();
    100. xiaomiRouter.Start();
    101. xiaomiRouter.Setting();
    102. xiaomiRouter.OpenWife();
    103. xiaomiRouter.Shutdown();
    104. Console.WriteLine();
    105. HuaweiFactory huaweiFactory = new HuaweiFactory();
    106. IPhoneProduct huaweiPhone = huaweiFactory.iphoneProduct();
    107. IRouterProduct huaweiRouter = huaweiFactory.routerProduct();
    108. huaweiPhone.Start();
    109. huaweiPhone.CallUp();
    110. huaweiPhone.Shutdown();
    111. huaweiPhone.SendSMS();
    112. huaweiRouter.Start();
    113. huaweiRouter.Setting();
    114. huaweiRouter.OpenWife();
    115. huaweiRouter.Shutdown();
    116. }
    117. #endregion

     

    希望大家:点赞,留言,关注咯~    

    😘😘😘😘

    唠家常

    • Xiaohei.Wang(Wenhao)的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我的QQ:841298494 (记得备注),大家一起进步

    今日无推荐

  • 相关阅读:
    [algorithm] 二叉树的DFS与BFS算法 (Java) -- 痛定思痛 彻底搞懂
    【React】精选5题
    【JVM笔记】年轻代与老年代
    zabbix安装部署
    WMS系统4.0,仓库管理的20年历史变局你知道吗?
    P2 Pytorch 张量数据类型
    ns-3-model-library wifi 浅析_ns-3wifi部分解析_ns-3网络模拟器wifi部分文档分析_Part3
    C++之static,静态变量
    【PAT(甲级)】1045 Favorite Color Stripe(映射转换成FIS)
    深度学习二三事-计算机视觉目标检测回顾
  • 原文地址:https://blog.csdn.net/Wenhao_China/article/details/126096923