Android 开发模式和优秀框架那些事

设计模式之二十三——工厂方法模式

2019-07-02  本文已影响3人  dd299

原文传送门

1 介绍

工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。

1.1 什么是工厂方法模式

工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

1.2 解决了什么问题

我们明确地计划不同条件下创建不同实例时,工厂模式解决了接口选择的问题。

2 原理

在工厂方法模式中有如下角色:

  1. 抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;
  2. Creator为抽象创建类,也就是抽象工厂。
  3. ConcreteCreator,具体实现工厂。具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。

2.1 uml图

通用类图

2.2 代码示例

Product代码示例

public abstract class Product {    
     //产品类的公共方法
     public void method1(){
             //业务逻辑处理
     }  
     //抽象方法
     public abstract void method2();    
}

ConcreteProduct代码示例

public class ConcreteProduct1 extends Product {
     public void method2() {
             //业务逻辑处理
     }
}
public class ConcreteProduct2 extends Product {
     public void method2() {
             //业务逻辑处理
     }
}

Creator代码示例

public abstract class Creator {    
     /*
      * 创建一个产品对象,其输入参数类型可以自行设置
      * 通常为String、Enum、Class等,当然也可以为空
      */        
     public abstract  T createProduct(Class c);
}

ConcreteCreator代码示例

public class ConcreteCreator extends Creator {     
     public  T createProduct(Class c){
             Product product=null;
             try {
                    product = (Product)Class.forName(c.getName()).newInstance();
             } catch (Exception e) {
                    //异常处理
             }
             return (T)product;         
     }
}

调用示例

public class Client {
     public static void main(String[] args) {
             Creator creator = new ConcreteCreator();
             Product product = creator.createProduct(ConcreteProduct1.class);
             /*
              * 继续业务处理
              */
     }
}

2.3 优缺点

3 适用场景

  1. 工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,增加代码的复杂度。
  2. 需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。万物皆对象,那万物也就皆产品类。比如:日志记录器。
  3. 工厂方法模式可以用在异构项目中,比如:数据库访问。再比如:设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
  4. 可以使用在测试驱动开发的框架下。

4 总结

作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。


参考书籍及文章
1.《Java与模式》,电子工业出版社,阎宏

  1. 《大话设计模式》,清华大学出版社,程杰
  2. 《设计模式——可复用面向对象软件的基础》,机械工业出版社,Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides
  3. 《设计模式之禅》,https://www.kancloud.cn/sstd521/design/193522
上一篇 下一篇

猜你喜欢

热点阅读