场景: (1)我们现在要生产的产品有多种 (2)每种产品的生产过程,都有一些是共同的逻辑,但是也有一些是特殊的逻辑 (3)现在要生产出来各种产品

1.常规

  1. package com.example.demo.pattern.factory;
  2. /**
  3. * @author chenchao
  4. */
  5. public class WithoutFactoryMethodPatternDemo {
  6. public static void main(String[] args) {
  7. Product product1 = Product1Factory.createProduct();
  8. Product product2 = Product2Factory.createProduct();
  9. Product product3 = Product3Factory.createProduct();
  10. product1.execute();
  11. product2.execute();
  12. product3.execute();
  13. // 问题在哪儿?
  14. // 跟模板方法模式的问题一模一样
  15. // 就是多个工厂类中,有生产产品的相同的通用逻辑,没有抽取出来,直接复制粘贴放多个工厂里了
  16. // 如果那段通用逻辑要修改
  17. // 就需要很麻烦到所有工厂中去修改代码;可能会忘记修改某个工厂的代码
  18. }
  19. public interface Product {
  20. void execute();
  21. }
  22. public static class Product1 implements Product {
  23. @Override
  24. public void execute() {
  25. System.out.println("产品1的功能逻辑");
  26. }
  27. }
  28. public static class Product2 implements Product {
  29. @Override
  30. public void execute() {
  31. System.out.println("产品2的功能逻辑");
  32. }
  33. }
  34. public static class Product3 implements Product {
  35. @Override
  36. public void execute() {
  37. System.out.println("产品3的功能逻辑");
  38. }
  39. }
  40. public static class Product1Factory {
  41. public static Product createProduct() {
  42. System.out.println("生产产品的通用逻辑,修改");
  43. System.out.println("生产产品1的特殊逻辑");
  44. return new Product1();
  45. }
  46. }
  47. public static class Product2Factory {
  48. public static Product createProduct() {
  49. System.out.println("生产产品的通用逻辑,修改");
  50. System.out.println("生产产品2的特殊逻辑");
  51. return new Product2();
  52. }
  53. }
  54. public static class Product3Factory {
  55. public static Product createProduct() {
  56. System.out.println("生产产品的通用逻辑");
  57. System.out.println("生产产品3的特殊逻辑");
  58. return new Product3();
  59. }
  60. }
  61. }

2.工厂方法模式

  1. package com.example.demo.pattern.factory;
  2. /**
  3. * @author chenchao
  4. * @date 2021/11/8
  5. */
  6. public class FactoryMethodPatternDemo {
  7. public static void main(String[] args) {
  8. Product product1 = Product1Factory.get().createProduct();
  9. Product product2 = Product2Factory.get().createProduct();
  10. Product product3 = Product3Factory.get().createProduct();
  11. product1.execute();
  12. product2.execute();
  13. product3.execute();
  14. }
  15. public interface Product {
  16. void execute();
  17. }
  18. public static class Product1 implements Product {
  19. @Override
  20. public void execute() {
  21. System.out.println("产品1的功能逻辑");
  22. }
  23. }
  24. public static class Product2 implements Product {
  25. @Override
  26. public void execute() {
  27. System.out.println("产品2的功能逻辑");
  28. }
  29. }
  30. public static class Product3 implements Product {
  31. @Override
  32. public void execute() {
  33. System.out.println("产品3的功能逻辑");
  34. }
  35. }
  36. public static abstract class AbstractProductFactory {
  37. public Product createProduct() {
  38. commonCreate();
  39. return specificCreate();
  40. }
  41. private void commonCreate() {
  42. System.out.println("生产产品的通用逻辑,修改");
  43. }
  44. protected abstract Product specificCreate();
  45. }
  46. public static class Product1Factory extends AbstractProductFactory {
  47. private static final Product1Factory instance = new Product1Factory();
  48. private Product1Factory() {
  49. }
  50. public static Product1Factory get() {
  51. return instance;
  52. }
  53. @Override
  54. public Product specificCreate() {
  55. System.out.println("生产产品1的特殊逻辑");
  56. return new Product1();
  57. }
  58. }
  59. public static class Product2Factory extends AbstractProductFactory {
  60. private static final Product2Factory instance = new Product2Factory();
  61. private Product2Factory() {
  62. }
  63. public static Product2Factory get() {
  64. return instance;
  65. }
  66. @Override
  67. public Product specificCreate() {
  68. System.out.println("生产产品2的特殊逻辑");
  69. return new Product2();
  70. }
  71. }
  72. public static class Product3Factory extends AbstractProductFactory {
  73. private static final Product3Factory instance = new Product3Factory();
  74. private Product3Factory() {
  75. }
  76. public static Product3Factory get() {
  77. return instance;
  78. }
  79. @Override
  80. public Product specificCreate() {
  81. System.out.println("生产产品3的特殊逻辑");
  82. return new Product3();
  83. }
  84. }
  85. }

3.说明

说实话,这种设计模式算是较为复杂一点的了,适用的是比较复杂的场景了
一般就是在有复杂工厂生产场景的情况下,比如就是需要多种工厂生产不同的产品,但是产品都是类似的,同时不同的工厂有一定的相同逻辑,那么就用这种模式