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