• 设计模式(十):抽象工厂模式(创建型模式)


            Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对
    象的接口,而无须指定它们的具体类。

           之前写过简单工厂和工厂方法模式(创建型模式),这两种模式比较简单。

           简单工厂模式其实不符合开闭原则,即对修改关闭,扩展开放。简单工厂每次需要新增新的产品就需要修改工厂类。而工厂方法模式,每个工厂只负责创建单一的产品,相当于真实工厂里面的一条流水线,如果一个工厂自身能创建多个产品呢?那就需要抽象工厂了。

          三种工厂模式的区别:

          简单工厂模式:一个抽象产品类(或接口),可以派生出多个具体产品类。 
                                   只有一个静态工厂,负责创建多个具体产品类的实例。
          工厂方法模式:一个抽象产品类(或接口),可以派生出多个具体产品类。   
                                   一个抽象工厂类(或接口),可以派生出多个具体工厂类。   
                                   每个具体工厂类只能创建一个具体产品类的实例。  
          抽象工厂模式:多个抽象产品类(或接口),可以派生出多个具体产品类。   
                                   一个抽象工厂类(或接口),可以派生出多个具体工厂类。   
                                   每个具体工厂类可以创建多个具体产品类的实例。   
       
    区别:工厂方法模式只有一个抽象产品类(或接口),而抽象工厂模式有多个。   
          工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。


    “抽象工厂”就像真的工厂,“工厂方法”就像工厂中的一条生产线。

    抽象工厂模式Demo:

    先看类图:

    工程结构:

    上代码:

    1. package com.figo.study2024.pattern.abstractfactory;
    2. /**
    3. * @ClassName:Fruit
    4. * @PackageName:com.figo.study2024.pattern.abstractfactory
    5. * @Description:水果接口
    6. * @Date:2024/3/8 10:25
    7. * @Author:figo
    8. */
    9. public interface Fruit {
    10. //采摘
    11. void pick();
    12. }
    13. package com.figo.study2024.pattern.abstractfactory;
    14. /**
    15. * @ClassName:Apple
    16. * @PackageName:com.figo.study2024.pattern.abstractfactory
    17. * @Description:苹果产品
    18. * @Date:2024/3/8 10:32
    19. * @Author:figo
    20. */
    21. public class Apple implements Fruit{
    22. @Override
    23. public void pick() {
    24. System.out.println("采摘苹果");
    25. }
    26. }
    27. package com.figo.study2024.pattern.abstractfactory;
    28. /**
    29. * @ClassName:Banana
    30. * @PackageName:com.figo.study2024.pattern.abstractfactory
    31. * @Description:香蕉产品
    32. * @Date:2024/3/8 10:35
    33. * @Author:figo
    34. */
    35. public class Banana implements Fruit{
    36. @Override
    37. public void pick() {
    38. System.out.println("采摘香蕉");
    39. }
    40. }
    41. package com.figo.study2024.pattern.abstractfactory;
    42. /**
    43. * @ClassName:Bag
    44. * @PackageName:com.figo.study2024.pattern.abstractfactory
    45. * @Description:包装盒接口
    46. * @Date:2024/3/8 10:36
    47. * @Author:figo
    48. */
    49. public interface Bag {
    50. //打包
    51. void pack(Fruit fruit);
    52. }
    53. package com.figo.study2024.pattern.abstractfactory;
    54. /**
    55. * @ClassName:AppleBag
    56. * @PackageName:com.figo.study2024.pattern.abstractfactory
    57. * @Description:苹果包装盒
    58. * @Date:2024/3/8 10:37
    59. * @Author:figo
    60. */
    61. public class AppleBag implements Bag{
    62. @Override
    63. public void pack(Fruit fruit) {
    64. System.out.println("苹果盒打包苹果");
    65. }
    66. }
    67. package com.figo.study2024.pattern.abstractfactory;
    68. /**
    69. * @ClassName:BananaBag
    70. * @PackageName:com.figo.study2024.pattern.abstractfactory
    71. * @Description:香蕉包装盒
    72. * @Date:2024/3/8 10:37
    73. * @Author:figo
    74. */
    75. public class BananaBag implements Bag{
    76. @Override
    77. public void pack(Fruit fruit) {
    78. System.out.println("香蕉盒打包苹果");
    79. }
    80. }
    81. package com.figo.study2024.pattern.abstractfactory;
    82. /**
    83. * @ClassName:AbstractFactory
    84. * @PackageName:com.figo.study2024.pattern.abstractfactory
    85. * @Description:抽象工厂,能生产多种产品,比工厂方法模式只能生产单一产品更强
    86. * @Date:2024/3/8 10:42
    87. * @Author:figo
    88. */
    89. public abstract class AbstractFactory {
    90. public abstract Fruit getFruit();
    91. public abstract Bag getBag();
    92. }
    93. package com.figo.study2024.pattern.abstractfactory;
    94. /**
    95. * @ClassName:AppleFactory
    96. * @PackageName:com.figo.study2024.pattern.abstractfactory
    97. * @Description:苹果工厂能生产苹果和苹果包装盒
    98. * @Date:2024/3/8 10:46
    99. * @Author:figo
    100. */
    101. public class AppleFactory extends AbstractFactory{
    102. @Override
    103. public Fruit getFruit() {
    104. return new Apple();
    105. }
    106. @Override
    107. public Bag getBag() {
    108. return new AppleBag();
    109. }
    110. }
    111. package com.figo.study2024.pattern.abstractfactory;
    112. /**
    113. * @ClassName:BananaFactory
    114. * @PackageName:com.figo.study2024.pattern.abstractfactory
    115. * @Description:香蕉工厂,能生产香蕉也能生产香蕉包装盒
    116. * @Date:2024/3/8 10:49
    117. * @Author:figo
    118. */
    119. public class BananaFactory extends AbstractFactory{
    120. @Override
    121. public Fruit getFruit() {
    122. return new Banana();
    123. }
    124. @Override
    125. public Bag getBag() {
    126. return new BananaBag();
    127. }
    128. }
    129. package com.figo.study2024.pattern.abstractfactory;
    130. /**
    131. * @ClassName:FruitGardenClient
    132. * @PackageName:com.figo.study2024.pattern.abstractfactory
    133. * @Description:水果园客户端,测试抽象工厂模式
    134. * @Date:2024/3/8 10:51
    135. * @Author:figo
    136. */
    137. public class FruitGardenClient {
    138. public static void main(String[] args) {
    139. fruitOrder();
    140. }
    141. /**
    142. * 水果订单
    143. */
    144. public static void fruitOrder()
    145. {
    146. //初始化工厂
    147. AbstractFactory factory = new AppleFactory();//spring使用注入方式,这里测试苹果工厂
    148. //苹果工厂能生产苹果
    149. Fruit fruit = factory.getFruit();
    150. fruit.pick();
    151. //苹果工厂也能生产包装盒
    152. Bag bag = factory.getBag();
    153. bag.pack(fruit);
    154. //以下物流运输业务。。。。
    155. }
    156. }

  • 相关阅读:
    软件测试工程师的职场发展顺序,月薪30k的测试岗技术要求是真的高...
    C# 第八章『多线程』◆第2节:线程的属性
    yum 安装的 nginx 添加自定义模块后重新编译安装
    ortp 交叉编译
    【毕业设计】基于单片机的太空游戏机 - 嵌入式 物联网 stm32 51
    MongoDB 常用命令
    使用docker compose快速搭建spark集群
    庖丁解牛:NIO核心概念与机制详解 04 _ 分散和聚集
    二手安捷伦E9323A射频传感器
    c# entity freamwork 判断是否存在
  • 原文地址:https://blog.csdn.net/figo0423/article/details/136553991