java设计模式-工厂模式

工厂模式的作用:
使创建者和调用者分离,类似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工程师的实体类即可,不需要去修改任何类和接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值