美文网首页Android 开发模式和优秀框架那些事
设计模式之二十三——工厂方法模式

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

作者: dd299 | 来源:发表于2019-07-02 13:42 被阅读3次

    原文传送门

    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

    相关文章

      网友评论

        本文标题:设计模式之二十三——工厂方法模式

        本文链接:https://www.haomeiwen.com/subject/dauucctx.html