java设计模式-工厂模式

来源:互联网 发布:泰勒展开式的矩阵形式 编辑:程序博客网 时间:2024/06/05 15:05

工厂模式的作用:
使创建者和调用者分离,类似spring的控制反转

应用场景:
JDK中的Calendar的getInstance方法
JDBC中的connection的获取
XML解析DocumentBuilderFactory创建解析器
反射中的对象的newInstance()

工厂模式主要分类:
1.简单工厂模式,最简单,使用最多,不易拓展
2.方法工厂模式,通过添加新的工程类实现拓展,会造成类很多

简单工厂模式举下例子:
首先是定义下公共类接口

/** * IT工程接口类 * @author liuxg * @date 2016年5月24日 下午6:50:04 */public interface ITEngineer {    /**     * IT职位     * @return     */    void position(); }

再者是实现类

public class JavaEngineer implements ITEngineer {    @Override    public void position() {        System.out.println("java工程师");    }}public class JavaScriptngineer implements ITEngineer {    @Override    public void  position() {        System.out.println("JavaScript工程师");    }}

再写个工厂类,用来专门创建类

/** * 简单工厂类 * @author liuxg * @date 2016年5月24日 下午6:58:33 */public class SimpleFactory {    public static ITEngineer getITEnginee(String position){        switch (position) {        case "Java":            return new JavaEngineer();        case "JavaScript":            return new JavaScriptngineer();        }        return null ;    }}

我们在客户端调用,就只依赖SimpleFactory 这个类了,实现了调用者和创造者的分离

/** * 测试客户端 * @author liuxg * @date 2016年5月24日 下午6:55:44 */public class Client01 {    public static void main(String[] args) {        ITEngineer engineer = SimpleFactory.getITEnginee("Java");        engineer.position();    }}

简单工厂模式设计简单,用得最多,但不易拓展,若要易于拓展,就使用方法工厂模式吧

首先我们来创建一个公共接口类

/**  * 该接口用于创建工程师实体类  */public interface MethodFactory {    ITEngineer create();    }

再创建俩个factory实现MethodFactory

public class JavaFactory implements MethodFactory{    @Override    public ITEngineer create() {        return new JavaEngineer();    }}public class JavaScriptFactory implements MethodFactory{    @Override    public ITEngineer create() {        return new JavaScriptngineer();    }}

在客户端调用的时候,我们就可以直接new了

/** * 测试客户端 * @author liuxg * @date 2016年5月24日 下午6:55:44 */public class Client02 {    public static void main(String[] args) {        ITEngineer engineer1 = new JavaScriptFactory().create();        ITEngineer engineer2 = new JavaFactory().create();        engineer1.position();        engineer2.position();    }}

如果这时候,我们需要拓展ITEngineer ,例如拓展一个UI工程师,那我们就再定义一个UIFactory来实现MethodFactory,然后返回UI工程师的实体类即可,不需要去修改任何类和接口

0 0