• 工厂模式 与 抽象工厂模式 的区别


    工厂模式:

    1. // 抽象产品接口
    2. interface Product {
    3. void showInfo();
    4. }
    5. // 具体产品A
    6. class ConcreteProductA implements Product {
    7. @Override
    8. public void showInfo() {
    9. System.out.println("This is Product A");
    10. }
    11. }
    12. // 具体产品B
    13. class ConcreteProductB implements Product {
    14. @Override
    15. public void showInfo() {
    16. System.out.println("This is Product B");
    17. }
    18. }
    19. // 抽象工厂类
    20. abstract class Creator {
    21. abstract Product createProduct();
    22. }
    23. // 具体工厂A,生产产品A
    24. class ConcreteCreatorA extends Creator {
    25. @Override
    26. Product createProduct() {
    27. return new ConcreteProductA();
    28. }
    29. }
    30. // 具体工厂B,生产产品B
    31. class ConcreteCreatorB extends Creator {
    32. @Override
    33. Product createProduct() {
    34. return new ConcreteProductB();
    35. }
    36. }
    37. public class FactoryMethodExample {
    38. public static void main(String[] args) {
    39. Creator creatorA = new ConcreteCreatorA();
    40. Product productA = creatorA.createProduct();
    41. productA.showInfo();
    42. Creator creatorB = new ConcreteCreatorB();
    43. Product productB = creatorB.createProduct();
    44. productB.showInfo();
    45. }
    46. }

    在这个示例中,Product 是抽象产品接口,ConcreteProductAConcreteProductB 是具体的产品类。Creator 是抽象工厂类,ConcreteCreatorAConcreteCreatorB 是具体的工厂类,分别生产不同的产品。在场景类中,通过具体的工厂来创建不同的产品,而无需直接涉及具体产品的实现类。这就是工厂方法模式的正确用法。

    抽象工厂模式

    1. // 抽象产品接口
    2. interface ProductA {
    3. void showInfo();
    4. }
    5. // 具体产品A1
    6. class ConcreteProductA1 implements ProductA {
    7. @Override
    8. public void showInfo() {
    9. System.out.println("This is Product A1");
    10. }
    11. }
    12. // 具体产品A2
    13. class ConcreteProductA2 implements ProductA {
    14. @Override
    15. public void showInfo() {
    16. System.out.println("This is Product A2");
    17. }
    18. }
    19. // 抽象产品接口
    20. interface ProductB {
    21. void showInfo();
    22. }
    23. // 具体产品B1
    24. class ConcreteProductB1 implements ProductB {
    25. @Override
    26. public void showInfo() {
    27. System.out.println("This is Product B1");
    28. }
    29. }
    30. // 具体产品B2
    31. class ConcreteProductB2 implements ProductB {
    32. @Override
    33. public void showInfo() {
    34. System.out.println("This is Product B2");
    35. }
    36. }
    37. // 抽象工厂接口
    38. interface AbstractFactory {
    39. ProductA createProductA();
    40. ProductB createProductB();
    41. }
    42. // 具体工厂1
    43. class ConcreteFactory1 implements AbstractFactory {
    44. @Override
    45. public ProductA createProductA() {
    46. return new ConcreteProductA1();
    47. }
    48. @Override
    49. public ProductB createProductB() {
    50. return new ConcreteProductB1();
    51. }
    52. }
    53. // 具体工厂2
    54. class ConcreteFactory2 implements AbstractFactory {
    55. @Override
    56. public ProductA createProductA() {
    57. return new ConcreteProductA2();
    58. }
    59. @Override
    60. public ProductB createProductB() {
    61. return new ConcreteProductB2();
    62. }
    63. }
    64. public class AbstractFactoryExample {
    65. public static void main(String[] args) {
    66. AbstractFactory factory1 = new ConcreteFactory1();
    67. ProductA productA1 = factory1.createProductA();
    68. ProductB productB1 = factory1.createProductB();
    69. productA1.showInfo();
    70. productB1.showInfo();
    71. AbstractFactory factory2 = new ConcreteFactory2();
    72. ProductA productA2 = factory2.createProductA();
    73. ProductB productB2 = factory2.createProductB();
    74. productA2.showInfo();
    75. productB2.showInfo();
    76. }
    77. }

    在这个示例中,AbstractFactory 是抽象工厂接口,ConcreteFactory1ConcreteFactory2 是具体工厂类,分别生产不同系列的产品。每个具体工厂类实现了创建一组相关产品的方法。这就是抽象工厂模式的示例。

    区别:

    抽象工厂模式(Abstract Factory Pattern)和工厂方法模式(Factory Method Pattern)是两种不同的设计模式,它们都属于创建型模式,用于创建对象。它们之间的区别在于抽象程度和用途。

    1. 抽象工厂模式

      • 抽象工厂模式用于创建一组相关或相互依赖的对象,这些对象通常属于不同的产品族。
      • 它包含一个抽象工厂接口,该接口声明了一组用于创建不同类型产品的抽象方法。每个具体工厂类实现了这些方法以创建特定产品族的对象。
      • 抽象工厂模式强调创建一组对象,通常涉及多个产品接口和多个产品实现类。
    2. 工厂方法模式

      • 工厂方法模式用于创建单一对象,但是通过子类来决定实例化哪个类。
      • 它包含一个抽象工厂基类(接口或抽象类),该基类声明了一个用于创建对象的抽象方法。每个具体工厂子类实现这个方法以返回特定的产品对象。
      • 工厂方法模式强调创建单一对象,每个工厂子类负责创建一种产品。

    总结:

           抽象工厂模式关注于一组相互关联的产品,而工厂方法模式关注于单一产品。抽象工厂模式的实现可能比较复杂,涉及多个产品族,而工厂方法模式通常相对简单,每个子类只负责一个产品。选择哪个模式取决于需求的复杂性和结构的设计。

           抽象工厂模式在工厂模式的基础上扩展了一个维度,不仅关注单一产品的创建,还关注一组相关或相互依赖的产品族的创建。这些产品族通常在业务逻辑上有关联,它们可能共同构成一个完整的功能。

    缺点总结:

    在抽象工厂模式中,如果你想要增加一个新的产品,比如产品C,你需要在抽象工厂接口(或抽象类)中添加一个新的方法来创建该产品。然后,所有的具体工厂类都必须实现这个新方法,为产品C提供实现。这会导致两个问题:

    1. 修改抽象类或接口: 在这个例子中,你需要在AbstractCreator中增加一个createProductC()方法,并且ConcreteFactory1 和ConcreteFactory2都必须实现这个方法。这违反了开闭原则,即系统应该对扩展开放,对修改关闭。

    2. 影响已有代码: 增加新方法会影响到所有已经实现了该抽象工厂的具体工厂类,即ConcreteFactory1 和ConcreteFactory2。这可能会导致许多现有的代码需要修改,因此它们与这个变化产生了依赖关系,即所谓的“有毒代码”。

    这种情况下,每次需要增加一个新的产品时,都会引发一系列的修改,从而导致系统的脆弱性和不稳定性。这就是抽象工厂模式的一个局限性,特别是当产品族的变化比较频繁时,扩展性不如其他设计模式。

    这也是为什么有时候推荐使用工厂方法模式,因为它对于新增产品更具有弹性,不会对已有的代码造成较大的影响。但抽象工厂模式的优势在于它能够同时创建一组相关的产品,适用于需要创建一组具有特定关联性的对象的情况。

    但是也有优点,在添加新的产品族时,只需要新增对应的产品接口和实现,而不需要修改已有的工厂类和产品类。这符合开闭原则,允许易于扩展而不影响现有代码。

  • 相关阅读:
    ESP32网络开发实例-Web服务器RGB LED调光
    【开发教程4】开源蓝牙心率防水运动手环-外部 Flash 读写
    面向6G的欠采样相移键控可见光调制方案
    Apollo配置中心-手把手教你搭建Apollo配置中心运行环境
    云服务器和本地服务器的优缺点分析
    AQS源码探究之竞争锁资源
    Error: “MountVolume.SetUp failed for volume pvc 故障处理
    C语言中的函数openlog
    【JVM】对象死亡判断
    《 机器人基础 》期末试卷(A)
  • 原文地址:https://blog.csdn.net/liuruiaaa/article/details/132621169