• 设计模式学习--Factory Method


    What

    Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

    Why

    Factory Method是一个比較基础的创建型模式,它主要在于由子类决定实例化哪一个类。主要用于框架代码或者工具包中。
    适用于例如以下场景:
    1、当一个类不知道它所必须创建的对象的类的时候
    2、当一个类希望由子类来指定它所创建对象的时候
    3、当类将创建对象的职责托付给多个帮助子类的某一个,而且你希望将哪一个帮助子类是代理者这一信息局部化的时候

    How

    如果例如以下场景,写一个语法分析器,须要支持C与java代码的语法分析,须要完毕代码语法检查和语法解析工作。以此为例实现工厂模式。
    语法分析器接口

    public interface Parsing {
    
        void checkGrammar();
    
        void parseCode();
    }
    

    C代码语法分析器实现

    public class CParsing implements Parsing {
    
        @Override
        public void checkGrammar() {
            System.out.println("check c grammar");
        }
    
        @Override
        public void parseCode() {
            System.out.println("parse c code");
        }
    }
    

    Java代码语法分析器实现

    public class JavaParsing implements Parsing {
    
        @Override
        public void checkGrammar() {
            System.out.println("check java grammar");
        }
    
        @Override
        public void parseCode() {
            System.out.println("parse java code");
        }
    }
    

    解析器工厂接口

    public interface ParsingFactory {
    
        Parsing createParsing();
    }
    

    C代码解析器工厂实现

    public class CParsingFactory implements ParsingFactory {
    
        @Override
        public Parsing createParsing() {
            return new CParsing();
        }
    }
    

    Java代码解析器工厂实现

    public class JavaParsingFactory implements ParsingFactory {
    
        @Override
        public Parsing createParsing() {
            return new JavaParsing();
        }
    }
    

    client调用

    public class App {
    
        public static void main( String[] args ){
            ParsingFactory factory=new CParsingFactory();
            Parsing parsing=factory.createParsing();
            parsing.checkGrammar();
            parsing.parseCode();
    
            ParsingFactory factory1=new JavaParsingFactory();
            Parsing parsing1=factory1.createParsing();
            parsing1.checkGrammar();
            parsing1.parseCode();
        }
    }
    

    以上演示样例类图例如以下:


    Discuss

    Abstarct Factory VS Factory Method
    在学习Factory Method就对Factory Method模式和Abstarct Factory非常迷惑,经过重复阅读两个章节,基本上总结出了两者的一个联系,Abstarct Factory是一个特殊的Factory Method,可是两者差别在哪呢?
    完毕Factory Method的演示样例发现,在Abstract Factory中演示样例的UML和Factory Method的演示样例的UML是结构是一样的,于是就思考为什么?
    两者的意图例如以下:
    Factory Method:定义一个创建对象的接口让子类来决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类
    Abstarct Factory:提供一个创建一系列相关或相互依赖的接口,而无需指定他们详细类。
    从以上粗体部分就能够体现其差别的地方。
    1.Abstarct Factory强调的是创建一系列相关相互依赖的接口,也就是Abstarct这个工厂能够生产一系列的对象,是一个一对多的关系,然后我又又一次考虑了一下,Abstarct Factory的演示样例,并进行了完好(详情见:设计模式学习--Abstarct Factory的ChangeLog)。它的扩展性側重横向扩展。比方在Abstarct Factory学习中的样例,我们又来一个RoleDao,我们是在DaoFactory中添加createRoleDao方法。
    2.Factory Method强调的是创建一个对象接口,让子类来决定实例化哪一个类,也就是它的工厂和产品是一对一的关系。它的扩展性側重的是垂直扩展,比方本节的演示样例,我们须要添加一个支持Sql语言的语法分析器,我须要添加一个SqlParsingFactory类和一个SqlParsing类。
    关于Abstarct Factory VS Factory Method的讨论还有例如以下能够參考:
    http://www.cnblogs.com/happyhippy/archive/2010/09/26/1836223.html
    http://www.cnblogs.com/procoder/archive/2009/04/24/1442920.html


  • 相关阅读:
    Editor REST Client
    log配置
    spring-boot-configuration-processor
    http请求
    做项目用到的一些正则表达式,贴出来共享
    批量插入的实现
    sql执行顺序对比
    Java常用的并发工具类:CountDownLatch、CyclicBarrier、Semaphore、Exchanger
    spring中bean的生命周期
    多属性的对象列表的两种排序方法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4363972.html
Copyright © 2020-2023  润新知