工厂设计模式分为三种
- 简单工厂模式
- 工厂方法
- 抽象方法
应用场景:
- JDK中Calendar的getInstatnce方法
- JDBC中Connection对象的获取
- Hibernate中SessionFactory创建Session
- Spring中IOC容器创建管理Bean对象
- XML解析时DocumentBuilderFactory创建解析器对象
- 反射中Class对象的newInstance
简单工厂模式:
简单工厂属于创建型模式,又叫做静态工厂方法模式.简单工厂模式是有一个工厂对象决定创建出那种产品的实例.简单工厂模式是工厂模式家族中简单实用的模式.它存在的目的是:定义一个用于创建对象的接口
实现方式: 有一个静态方法,用来接收参数,,并根据参数返回实现同一接口的不同类的实例
简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,他决定哪一个产品应当被实例化,如同一个交通警察站在来往的车流中,决定放行某一个方向的车辆,
简单工厂的组成:
- 工厂类角色: 本模式的核心,含有一定的商业逻辑和判断逻辑,在java中它往往有一个具体类来来实现
- 抽象产品角色: 他一般是具体产品继承的父类或者实现的接口,在java中由接口或者抽象类来实现
- 具体产品角色 : 工厂类所创建的对象就是此角色的实例,在一个具体类实现
/**
* 产品接口
* @author zzj
*
*/
public interface IProduct {
void act();
}
/**
* 具体实现类
* 相当于ConcreteProductA
* @author zzj
*
*/
public class Washer implements IProduct {
public Washer(){
System.out.println("Washer is produced");
}
@Override
public void act() {
System.out.println("Wash the clothes!");
}
}
/**
* 具体实现类
* 相当于ConcreteProductB
* @author zzj
*
*/
public class AirCondition implements IProduct {
public AirCondition(){
System.out.println("AirCondition is produced");
}
@Override
public void act() {
System.out.println("Cool down!");
}
}
/**
* 生产工厂类
* @author zzj
*
*/
public class SimpleFactory {
public static IProduct createFactory(String productName) throws Exception{
if("washer".equals(productName)){
return new Washer();
}else if("airCondition".equals(productName)){
return new AirCondition();
}else{
throw new Exception();
}
}
}
/**
* 简单工厂客户端
* @author zzj
* 2017/6/3
*/
public class Client {
public static void main(String[] args){
try {
SimpleFactory.createFactory("washer");
SimpleFactory.createFactory("airCondition");
//冰箱
SimpleFactory.createFactory("Icebox");
} catch (Exception e) {
System.out.println("no product");
}
}
}
优点:客户端可以免除直接创建产品对象的责任,而仅仅负责消费对象就可以,实现了对职责权利的分割,有利于结构优化
缺点
- 每次想要增加一种新产品,必须更新工厂类的源代码,
- 如果产品类过多,代码逻辑很复杂,整个系统都依赖工厂类,一旦工厂类出现问题,系统将不能工作
工厂方法模式: 是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再是由一个工厂类决定哪一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做
- 抽象工厂角色: 这是工厂方法模式的核心,他与应用程序无关.是具体工厂角色必须要实现的接口或者必须继承的父类
- 具体工厂角色: 和逻辑业务有关,创建具体的产品对象
- 抽象产品角色: 抽象类或接口
- 具体产品角色: 工厂类创建的具体实例对象
在工厂方法中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类完成,允许系统在不修改工厂角色的情况下,创建新的产品,符合开闭原则
优点: 每个产品都有自己对应的工厂类,互不干涉,增加或者修改不影响其他产品
缺点: 产品越多,需要创建的工厂类越多
抽象工厂设计模式:
抽象工厂设计模式是对产品族而言的,给客户A段提供一个接口,可以创建多个产品族中的产品对象
适用条件:
- 系统中有多个产品族,而系统一次只可能消费其中一族产品
- 同属于一个产品族的产品一起适用
角色:
- 抽象工厂角色: 抽象类或者接口
- 具体工厂角色: 和业务逻辑相关,创建具体的产品对象
- 抽象产品角色: 抽象类或者接口
- 具体产品角色: 工厂类创建的具体实例对象