设计模式学习--Factory Method

What

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

Why

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

How

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

public interface Parsing {

    void checkGrammar();

    void parseCode();
}

C代码语法分析器实现app

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");
    }
}

解析器工厂接口ide

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();
    }
}

客户端调用spa

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

相关文章
相关标签/搜索