1 初识简单工厂:
定义:提供一个创建对象实例,而不关心具体实现的功能;
结构:
参考实现:
public class Client {
public static final int A = 1;
public static final int B = 1;
/**
* @param args
*/
public static void main(String[] args) {
Factory factory = new Factory();
ProductSample productSample = factory.makeProduct(A);
productSample.function();
}
}
/**
* 创建产品的地方
* @author zm
*
*/
public class Factory {
ProductSample productSample;
public ProductSample makeProduct(int i){
if(i == 1) {
productSample = new ProductA();
}
if(i == 2) {
productSample = new ProductB();
}
return productSample;
}
}
public interface ProductSample {
public void function(); // 产品具备的功能
}
public class ProductA implements ProductSample {
@Override
public void function() {
System.out.println("this is productA, i can dance for you");
}
}
public class ProductB implements ProductSample {
@Override
public void function() {
System.out.println("this is productB, i can sing for you");
}
}
2 体会简单工厂:
不用模式的解决方案:面向接口编程,具体实现类可以有多种,根据配置参数决定具体使用哪个实现类
使用模式的解决方案:直接 new 具体实现类; 这样不灵活,以后替换别的实现方案时,需要修改具体代码
3 理解简单工厂:
3.1) 典型疑问:上述案例,创建实例仅仅是从客户端类client移动到factory类,就这么简单吗?
回答: 理解简单工厂所处的位置,
客户端仅仅根据需求文档, 发送需要产品参数给工厂即可,其余事情交给工厂,
客户端真正实现和具体实现的隔离
3.2)认识简单工厂:功能就是用于创建接口,抽象类,普通类的实例
3.3)简单工厂的变种:
a) 静态工厂:就是将工厂类构造函数私有化,创建方法static化
3.4)简单工厂创建范围: 控制在一个独立的组件级别或模块级别
3.5) 时序图:
3.6) 可配置的简单工厂: 使用配置文件+反射方式
eg:
public class Factory {
/**
* 具体的创造Api的方法,根据配置文件的参数来创建接口
* @return 创造好的Api对象
*/
public static Api createApi(){
//直接读取配置文件来获取需要创建实例的类
//至于如何读取Properties还有如何反射这里就不解释了
Properties p = new Properties();
InputStream in = null;
try {
// 从配置文件中决定 是new出具体的哪个接口实现类
in = Factory.class.getResourceAsStream("FactoryTest.properties");
p.load(in);
} catch (IOException e) {
System.out.println("装载工厂配置文件出错了,具体的堆栈信息如下:");
e.printStackTrace();
}finally{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//用反射去创建具体产品实现类;
Api api = null;
try {
api = (Api)Class.forName(p.getProperty("ImplClass")).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return api;
}
}
FactoryTest.properties:
ImplClass=cn.javass.dp.simplefactory.example5.Impl
3.7)优缺点:
a) 帮助封装
b) 可能增加客户端使用复杂度(eg: 根据参数不同 常见不同具体实现类)
4 思考简单工厂:
本质:是选择,而不是实现,实现类是已经都写好的,仅需要做出要选择哪种实现写法
何时选用:
a) 完全封装隔离的具体实现,外部只能通过接口来操作封装体---> 客户端通过工厂获取对应的接口,具体实现交给工厂调用具体实现类
b) 将对外创建对象的职责集中管理和控制
5 简单工厂脑图: