当前位置:   article > 正文

设计模式-工厂方法模式

设计模式-工厂方法模式

一、工厂方法

1、生活场景

        系统常见的数据导出功能:数据导出PDF、WORD等常见格式。

2、工厂方法模式

        是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

3、核心角色

  • 抽象工厂角色

这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类实现。

  • 具体工厂角色

担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建导出类。

  • 抽象导出角色

工厂方法模式所创建的对象的超类,也就是所有导出类的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常使用抽象类实现。

  • 具体导出角色

这个角色实现了抽象导出角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体导出角色的实例。

3、核心角色

  • 抽象工厂角色

这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类实现。

  • 具体工厂角色

担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建导出类。

  • 抽象导出角色

工厂方法模式所创建的对象的超类,也就是所有导出类的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常使用抽象类实现。

  • 具体导出角色

这个角色实现了抽象导出角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体导出角色的实例。

4、UML关系图

5、源代码实现

  1. // 客户端角色
  2. public class C01_FactoryMethod {
  3. public static void main(String[] args) {
  4. String data = "" ;
  5. ExportFactory factory = new ExportWordFactory () ;
  6. ExportFile exportWord = factory.factory("user-word") ;
  7. exportWord.export(data) ;
  8. factory = new ExportPdfFactory() ;
  9. ExportFile exportPdf =factory.factory("log-pdf") ;
  10. exportPdf.export(data) ;
  11. }
  12. }
  13. // 抽象工厂角色
  14. interface ExportFactory {
  15. ExportFile factory (String type) ;
  16. }
  17. // 具体工厂角色
  18. class ExportWordFactory implements ExportFactory {
  19. @Override
  20. public ExportFile factory(String type) {
  21. if ("user-word".equals(type)){
  22. return new ExportUserWordFile() ;
  23. } else if ("log-word".equals(type)){
  24. return new ExportLogWordFile() ;
  25. } else {
  26. throw new RuntimeException("没有找到对象") ;
  27. }
  28. }
  29. }
  30. class ExportPdfFactory implements ExportFactory {
  31. @Override
  32. public ExportFile factory(String type) {
  33. if ("user-pdf".equals(type)){
  34. return new ExportUserPdfFile() ;
  35. } else if ("log-pdf".equals(type)){
  36. return new ExportLogPdfFile() ;
  37. } else {
  38. throw new RuntimeException("没有找到对象") ;
  39. }
  40. }
  41. }
  42. // 抽象导出角色
  43. interface ExportFile {
  44. boolean export (String data) ;
  45. }
  46. // 具体导出角色
  47. class ExportUserWordFile implements ExportFile {
  48. @Override
  49. public boolean export(String data) {
  50. System.out.println("导出用户Word文件");
  51. return true;
  52. }
  53. }
  54. class ExportLogWordFile implements ExportFile {
  55. @Override
  56. public boolean export(String data) {
  57. System.out.println("导出日志Word文件");
  58. return true;
  59. }
  60. }
  61. class ExportUserPdfFile implements ExportFile {
  62. @Override
  63. public boolean export(String data) {
  64. System.out.println("导出用户Pdf文件");
  65. return true;
  66. }
  67. }
  68. class ExportLogPdfFile implements ExportFile {
  69. @Override
  70. public boolean export(String data) {
  71. System.out.println("导出日志Pdf文件");
  72. return true;
  73. }
  74. }

二、Spring应用

1、场景描述

基于spring框架的配置实现如下流程:汽车工厂根据不同的国家,生产不同类型的汽车。

2、核心工厂类

  1. public class ProductCar implements CarFactory {
  2. private Map<String, CarEntity> carMap = null;
  3. public ProductCar() {
  4. carMap = new HashMap<>();
  5. carMap.put("china", new CarEntity("中国", "黑色","红旗"));
  6. carMap.put("america", new CarEntity("美国", "白色","雪佛兰"));
  7. }
  8. @Override
  9. public CarEntity getCar(String type) {
  10. return carMap.get(type);
  11. }
  12. }

3、核心Xml配置文件

  1. <bean id="productCarFactory" class="com.model.design.spring.node03.factoryMethod.ProductCar" />
  2. <bean id="car1" factory-bean="productCarFactory" factory-method="getCar">
  3. <constructor-arg name="type" value="china" />
  4. </bean>
  5. <bean id="car2" factory-bean="productCarFactory" factory-method="getCar">
  6. <constructor-arg name="type" value="america" />
  7. </bean>

4、测试类

  1. public class SpringTest {
  2. @Test
  3. public void test01 (){
  4. ApplicationContext context01 = new ClassPathXmlApplicationContext("/spring/spring-factorymethod.xml");
  5. CarEntity car1 = (CarEntity)context01.getBean("car1") ;
  6. CarEntity car2 = (CarEntity)context01.getBean("car2") ;
  7. System.out.println(car1);
  8. System.out.println(car2);
  9. }
  10. }

输出结果

  1. CarEntity{country='中国', color='黑色', name='红旗'}
  2. CarEntity{country='美国', color='白色', name='雪佛兰'}

三、工厂方法小结

工厂方法中,把创建类的动作延迟,就是通过对应的工厂来生成类的对象,这种设计方式符合“开闭”原则。缺点就是当产品的种类过多的时候,需要定义很多产品对应的工厂类。

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

闽ICP备14008679号