工厂方法模式
1.定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法模式使得一个类的实例化延迟到其子类。工厂方法模式非常好的诠释了面向对象六大设计原则之一的依赖倒置原则:要依赖抽象,不要依赖具体类。
2.包含角色及UML类图:
抽象工厂角色(Creator):工厂方法模式的核心,工厂类必须实现此接口
具体工厂角色(Concrete Creator):实现了抽象工厂接口,含有与应用密切相关的逻辑
抽象产品角色(Product):负责定义产品的共性,实现对产品的抽象定义
具体产品角色(Concrete Product):实现抽象产品角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体产品角色的实例
3.应用
Spring中的工厂方法模式
// AbstractFactoryBean.java
// 继承了FactoryBean,工厂Bean的主要作用是为了实现getObject()返回Bean实例
public abstract class AbstractFactoryBean<T> implements FactoryBean<T>, BeanClassLoaderAware,
BeanFactoryAware, InitializingBean, DisposableBean {
// 定义了获取对象的前置判断工作,创建对象的工作则交给了一个抽象方法
// 这里判断了Bean是不是单例并且是否已经被加载过了(未初始化但加载过了,这个问题涉及到Spring处理循环依赖)
public final T getObject() throws Exception {
return this.isSingleton()?(this.initialized?this.singletonInstance:this.getEarlySingletonInstance()):this.createInstance();
}
// 由子类负责具体创建对象
protected abstract T createInstance() throws Exception;
}
Spring中这么定义的好处在于:
(1) 保证了创建Bean的方式的多样性
Bean工厂有很多种,它们负责创建各种各样不同的Bean,比如Map类型的Bean,List类型的Bean,子类不需要关心Bean的类型,只需要关心如何创建Bean。
(2) 严格规定了Bean创建前后的其它动作
虽然子类可以自由的去创建Bean,但是创建Bean之前的准备工作以及创建Bean之后对Bean的处理工作是AbstractFactoryBean设定好了的,子类不需要关心。
抽象工厂模式
1.定义:为创建一组相关或相互依赖的对象提供一个接口。
2.包含角色及UML类图:
抽象工厂角色(Abstract Factory):抽象工厂模式的核心,工厂类必须实现此接口
具体工厂角色(Concrete Factory):实现了抽象工厂角色所声明的接口,含有选择合适产品对象的逻辑
抽象产品角色(Product):负责定义产品的共性,实现对产品的抽象定义
具体产品角色(Concrete Product):实现抽象产品角色所声明的接口,抽象工厂模式所创建的每一个对象都是某个具体产品角色的实例
3.应用
工厂方法模式适用于一个产品等级结构,抽象工厂模式是面对多个产品等级结构。