当前位置:   article > 正文

设计模式详解---工厂模式_设计模式-工厂模式详解

设计模式-工厂模式详解

1. 简介

        工厂模式(Factory Pattern)是一种常见的创建型设计模式,用于创建对象的过程中封装对象的实例化逻辑。工厂模式通过定义一个共同的接口来创建对象,而不暴露具体的创建逻辑给客户端。这样可以提高代码的灵活性、可维护性和可扩展性。

2. 工厂模式的优点

  • 封装了对象的创建过程,客户端只需要关心接口而无需关心具体的实现细节。
  • 提供了一种可扩展的方式来创建对象,可以轻松添加新的具体产品类。
  • 通过工厂方法可以集中管理对象的创建,提高代码的可维护性和重用性。

3.三种工厂模式概念以及对比

工厂模式可以分为三种主要的变体:

  1. 简单工厂模式(Simple Factory Pattern):简单工厂模式通过一个工厂类来创建对象,客户端通过传递不同的参数给工厂类来获取不同类型的对象。工厂类根据参数的不同,内部选择实例化哪个具体的产品类。这种模式隐藏了对象的创建逻辑,但违背了开闭原则,因为每次新增产品类型时都需要修改工厂类。

  2. 工厂方法模式(Factory Method Pattern):工厂方法模式将对象的创建委托给具体的工厂类。每个具体的工厂类都实现了一个工厂接口或抽象类,负责创建一类具体的产品对象。客户端通过调用工厂方法来获取所需的产品对象。工厂方法模式符合开闭原则,因为增加新的产品类型只需要添加对应的具体工厂类即可。

  3. 抽象工厂模式(Abstract Factory Pattern):是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这些变体都属于工厂模式,目的是为了封装对象的创建过程,提供一种简单、灵活、可扩展的方式来创建对象。选择哪种变体取决于具体的应用需求和设计考虑。

4. 案例及代码

我们以创建Product产品为例,设计一下简单工厂模式、工厂方法模式和抽象工厂模式

4.1.简单工厂模式

你只需要告诉工厂需要啥产品,他就给你生产出来,这种设计的弊端就是不遵守开闭原则,当新增了一个产品,需要修改工厂的代码:

具体代码:

  1. /**
  2. * @Author: stukk
  3. * @Description: 产品接口
  4. * @DateTime: 2023-12-14 21:52
  5. **/
  6. public interface Product {
  7. void getProductName();
  8. }
  9. /**
  10. * @Author: stukk
  11. * @Description: 产品1类
  12. * @DateTime: 2023-12-14 21:55
  13. **/
  14. public class Product1 implements Product {
  15. @Override
  16. public void getProductName() {
  17. System.out.println("这是产品1");
  18. }
  19. }
  20. /**
  21. * @Author: stukk
  22. * @Description: 产品2类
  23. * @DateTime: 2023-12-14 21:55
  24. **/
  25. public class Product2 implements Product {
  26. @Override
  27. public void getProductName() {
  28. System.out.println("这是产品2");
  29. }
  30. }
  31. /**
  32. * @Author: stukk
  33. * @Description: 产品3类
  34. * @DateTime: 2023-12-14 21:55
  35. **/
  36. public class Product3 implements Product {
  37. @Override
  38. public void getProductName() {
  39. System.out.println("这是产品3");
  40. }
  41. }
  42. /**
  43. * @Author: stukk
  44. * @Description: 简单工厂类
  45. * @DateTime: 2023-12-14 22:10
  46. **/
  47. public class Factory {
  48. public static Product createProduct(String type){
  49. if(type.equalsIgnoreCase("product1")){
  50. return new Product1();
  51. }else if(type.equalsIgnoreCase("product2")){
  52. return new Product2();
  53. }else if(type.equalsIgnoreCase("product3")){
  54. return new Product3();
  55. }else{
  56. throw new IllegalArgumentException("Invalid product type");
  57. }
  58. }
  59. }
  60. /**
  61. * @Author: stukk
  62. * @Description: 客户端代码示例
  63. * @DateTime: 2023-12-14 21:51
  64. **/
  65. public class FactoryModeExample {
  66. public static void main(String[] args) {
  67. Product product = Factory.createProduct("product1");
  68. product.getProductName();
  69. product = Factory.createProduct("product2");
  70. product.getProductName();
  71. product = Factory.createProduct("product4");
  72. }
  73. }

运行效果:

4.2.工厂方法模式

定义多个具体工厂类,用户需要哪个产品就去调用哪个产品的工厂的方法,比如你需要华为手机,你就去华为手机的工厂要:

具体代码:

  1. /**
  2. * @Author: stukk
  3. * @Description: 产品接口
  4. * @DateTime: 2023-12-14 21:52
  5. **/
  6. public interface Product {
  7. void getProductName();
  8. }
  9. /**
  10. * @Author: stukk
  11. * @Description: 产品1类
  12. * @DateTime: 2023-12-14 21:55
  13. **/
  14. public class Product1 implements Product {
  15. @Override
  16. public void getProductName() {
  17. System.out.println("这是产品1");
  18. }
  19. }
  20. /**
  21. * @Author: stukk
  22. * @Description: 产品2类
  23. * @DateTime: 2023-12-14 21:55
  24. **/
  25. public class Product2 implements Product {
  26. @Override
  27. public void getProductName() {
  28. System.out.println("这是产品2");
  29. }
  30. }
  31. /**
  32. * @Author: stukk
  33. * @Description: 产品3类
  34. * @DateTime: 2023-12-14 21:55
  35. **/
  36. public class Product3 implements Product {
  37. @Override
  38. public void getProductName() {
  39. System.out.println("这是产品3");
  40. }
  41. }
  42. /**
  43. * @Author: stukk
  44. * @Description: 工厂接口
  45. * @DateTime: 2023-12-14 22:10
  46. **/
  47. public interface Factory {
  48. Product createProduct();
  49. }
  50. /**
  51. * @Author: stukk
  52. * @Description: 产品1的工厂类
  53. * @DateTime: 2023-12-14 23:02
  54. **/
  55. public class Product1Factory implements Factory {
  56. @Override
  57. public Product createProduct() {
  58. return new Product1();
  59. }
  60. }
  61. /**
  62. * @Author: stukk
  63. * @Description: 产品2的工厂类
  64. * @DateTime: 2023-12-14 23:02
  65. **/
  66. public class Product2Factory implements Factory {
  67. @Override
  68. public Product createProduct() {
  69. return new Product2();
  70. }
  71. }
  72. /**
  73. * @Author: stukk
  74. * @Description: 产品3的工厂类
  75. * @DateTime: 2023-12-14 23:02
  76. **/
  77. public class Product3Factory implements Factory {
  78. @Override
  79. public Product createProduct() {
  80. return new Product3();
  81. }
  82. }
  83. /**
  84. * @Author: stukk
  85. * @Description: 客户端代码示例
  86. * @DateTime: 2023-12-14 21:51
  87. **/
  88. public class FactoryMethodExample {
  89. public static void main(String[] args) {
  90. // 需要产品1:
  91. Factory factory = new Product1Factory();
  92. Product product = factory.createProduct();
  93. product.getProductName();
  94. // 产品2
  95. factory = new Product2Factory();
  96. product = factory.createProduct();
  97. product.getProductName();
  98. }
  99. }

运行结果: 

4.3.抽象工厂模式

现在太晚了,抽象工厂模式明天再写

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/222497
推荐阅读
  

闽ICP备14008679号