工厂模式
应用模式
1.简单工厂模式(不属于GOF的23种经典设计模式)
相比较于设计模式,这更像一种编程习惯。
结构:
抽象产品:定义了产品的规范,描述主要的特征
具体产品:实现或者继承抽象产品的子类
具体工厂:提供创建产品的方法,通过通过调用该方法来创建产品
优点:
删除线格式 封装了创建对象的过程,可以直接通过参数获取对象。把对象的创建和业务逻辑层分开,避免了以后修改客户代码,如果要实现更新产品直接修改工厂类,而不需要在源码中修改,降低了客户代码的修改的可能性,更容易扩展
缺点:
增加新产品时,还是需要修改工厂类代码,违背了“开闭原则”
2.工厂方法模式
概念:
定义一个用于创建对象的接口,让子类决定实例化哪个产品对象类。工厂方法使一个产品类的实例化延迟到其他工厂的子类
结构:
抽象产品:定义了产品的规范,描述主要的特征
具体产品:实现抽象产品所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应
具体工厂:实现抽象工厂中的抽象方法,完成具体产品的创建
抽象工厂:提供创建产品的方法,通过通过调用该方法来创建产品
优点:
用户只需要知道具体工厂名称,无需知道具体创建过程
在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无需对原工厂进行任何修改,满足开闭原则
缺点:
每增加一个产品就要增加一个具体的产品类和一个对应的具体工厂类,这增加了系统的复杂度
3.抽象工厂模式
概念:
为访问类提供一组相关或相互依赖的对象接口,同时访问类无需指定具体类就能得到同族的不同等级的产品模式结构.抽象模式可以生产多个等级的产品,是工厂模式的升级版
优点:
当有一个产品族的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
缺点:
当产品族中需要添加一个新产品时,所有的工厂类都需要进行修改
模式扩展
简单工厂模式+配置文件解除耦合
步骤:
//定义存储容器
private static HashMap<String, coffe> map = new HashMap<String, coffe>();
static{
//创建对象
Properties p = new Properties();
//调用p对象中的load方法进行文件配置的加载
InputStream is = CoffeeStore.class.getClassLoader().getResourceAsStream("文件名");
try {
p.load(is);
//从p集合中获取全类名并创建对象
Set<Object> keys = p.keySet();
for (Object key : keys){
String className = p.getProperty((String) key);
//通过反射技术创建对象
Class clazz = Class.forName(className);
coffe coffee = (coffe) clazz.newInstance();
//将名称和对象存储到容器中
map.put((String) key,coffee);
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}