场景: (1)就是我们现在要生产的不是一个一个产品,而一个一个的产品组合 (2)比如说我们有产品ABC,现在第一种产品组合是A+B,第二种产品组合是B+C,第三种产品组合是A+C (3)就是要对工厂模式进行进一步的增强

1.常规

  1. package com.example.demo.pattern.factory;
  2. /**
  3. * @author chenchao
  4. * @date 2021/11/9
  5. */
  6. public class WithoutAbstractFactoryPatternDemo {
  7. public static void main(String[] args) {
  8. // 我们现在要创建产品A1+产品B1的组合
  9. // ProductA productA1 = new ProductA1();
  10. // ProductB productB1 = new ProductB1();
  11. //
  12. // productA1.execute();
  13. // productB1.execute();
  14. // 变成产品A1+产品B3的组合
  15. ProductA productA1 = new ProductA1();
  16. ProductB otherProductB3 = new ProductB3();
  17. productA1.execute();
  18. otherProductB3.execute();
  19. // 问题来了,调整产品组合的这个行为,如果你手动创建产品组合的代码,有100个地方,A1+B1
  20. // 一旦要调整,就是要对100个地方的代码,手动一点一点的去修改,组合的逻辑
  21. // 不可维护,不可扩展
  22. // 我们现在要创建产品A2+产品B2的组合
  23. ProductA productA2 = new ProductA2();
  24. ProductB productB2 = new ProductB2();
  25. productA2.execute();
  26. productB2.execute();
  27. // 我们现在要创建产品A3+产品B3的组合
  28. ProductA productA3 = new ProductA3();
  29. ProductB productB3 = new ProductB3();
  30. productA3.execute();
  31. productB3.execute();
  32. }
  33. public interface ProductA {
  34. void execute();
  35. }
  36. public static class ProductA1 implements ProductA {
  37. @Override
  38. public void execute() {
  39. System.out.println("产品A1的功能逻辑");
  40. }
  41. }
  42. public static class ProductA2 implements ProductA {
  43. @Override
  44. public void execute() {
  45. System.out.println("产品A2的功能逻辑");
  46. }
  47. }
  48. public static class ProductA3 implements ProductA {
  49. @Override
  50. public void execute() {
  51. System.out.println("产品A3的功能逻辑");
  52. }
  53. }
  54. public interface ProductB {
  55. void execute();
  56. }
  57. public static class ProductB1 implements ProductB {
  58. @Override
  59. public void execute() {
  60. System.out.println("产品B1的功能逻辑");
  61. }
  62. }
  63. public static class ProductB2 implements ProductB {
  64. @Override
  65. public void execute() {
  66. System.out.println("产品B2的功能逻辑");
  67. }
  68. }
  69. public static class ProductB3 implements ProductB {
  70. @Override
  71. public void execute() {
  72. System.out.println("产品B3的功能逻辑");
  73. }
  74. }
  75. }

2.抽象工程模式

  1. package com.example.demo.pattern.factory;
  2. /**
  3. * @author chenchao
  4. * @date 2021/11/9
  5. */
  6. public class AbstractFactoryPatternDemo {
  7. public static void main(String[] args) {
  8. // 产品A1+产品B1 -> 产品A1+产品B3
  9. ProductA firstProductA = Factory1.get().createProductA();
  10. ProductB firstProductB = Factory1.get().createProductB();
  11. firstProductA.execute();
  12. firstProductB.execute();
  13. // 产品A2+产品B2
  14. ProductA secondProductA = Factory2.get().createProductA();
  15. ProductB secondProductB = Factory2.get().createProductB();
  16. secondProductA.execute();
  17. secondProductB.execute();
  18. // 产品A3+产品B3
  19. ProductA thirdProductA = Factory3.get().createProductA();
  20. ProductB thirdProductB = Factory3.get().createProductB();
  21. thirdProductA.execute();
  22. thirdProductB.execute();
  23. // 哪怕你有100个地方定义了产品组合,要调整组合的逻辑,只要修改一个工厂就可以了
  24. }
  25. public interface ProductA {
  26. void execute();
  27. }
  28. public static class ProductA1 implements ProductA {
  29. @Override
  30. public void execute() {
  31. System.out.println("产品A1的功能逻辑");
  32. }
  33. }
  34. public static class ProductA2 implements ProductA {
  35. @Override
  36. public void execute() {
  37. System.out.println("产品A2的功能逻辑");
  38. }
  39. }
  40. public static class ProductA3 implements ProductA {
  41. @Override
  42. public void execute() {
  43. System.out.println("产品A3的功能逻辑");
  44. }
  45. }
  46. public interface ProductB {
  47. void execute();
  48. }
  49. public static class ProductB1 implements ProductB {
  50. @Override
  51. public void execute() {
  52. System.out.println("产品B1的功能逻辑");
  53. }
  54. }
  55. public static class ProductB2 implements ProductB {
  56. @Override
  57. public void execute() {
  58. System.out.println("产品B2的功能逻辑");
  59. }
  60. }
  61. public static class ProductB3 implements ProductB {
  62. @Override
  63. public void execute() {
  64. System.out.println("产品B3的功能逻辑");
  65. }
  66. }
  67. public interface Factory {
  68. ProductA createProductA();
  69. ProductB createProductB();
  70. }
  71. public static class Factory1 implements Factory {
  72. private static final Factory1 instance = new Factory1();
  73. private Factory1() {
  74. }
  75. public static Factory get() {
  76. return instance;
  77. }
  78. @Override
  79. public ProductA createProductA() {
  80. return new ProductA1();
  81. }
  82. @Override
  83. public ProductB createProductB() {
  84. return new ProductB3();
  85. }
  86. }
  87. public static class Factory2 implements Factory {
  88. private static final Factory2 instance = new Factory2();
  89. private Factory2() {
  90. }
  91. public static Factory get() {
  92. return instance;
  93. }
  94. @Override
  95. public ProductA createProductA() {
  96. return new ProductA2();
  97. }
  98. @Override
  99. public ProductB createProductB() {
  100. return new ProductB2();
  101. }
  102. }
  103. public static class Factory3 implements Factory {
  104. private static final Factory3 instance = new Factory3();
  105. private Factory3() {
  106. }
  107. public static Factory get() {
  108. return instance;
  109. }
  110. @Override
  111. public ProductA createProductA() {
  112. return new ProductA3();
  113. }
  114. @Override
  115. public ProductB createProductB() {
  116. return new ProductB3();
  117. }
  118. }
  119. }

3.说明

这种模式就更复杂了,在实际开发场景中,更加少见了。因为其核心思想是,如果需要一个工厂,这个工厂可以生产出相关联的一批产品,然后不同的工厂实现,会生产出一批不同的产品组合。