前言
相比于工厂模式,工厂模式是生产不同的复杂的具体的产品对象,而抽象工厂模式呢,抽象工厂生产出抽象产品,抽象产品通过不同组合返回不同具体的产品的对象.说起来有点抽象,我们看下UML图,在看下具体的代码可能你就清楚了
定义
- 定义:为一组相关或者相互依赖的对象提供一个接口,而不需要指定他们具体的类.
- 使用场景:
- 优点:相比于工厂模式,灵活,跟builder模式类似,通过不同产品的不同部件,组成新的产品.而不需要每个产品都写一个工厂
- 缺点:当然,缺点也很明显,那就事随着抽象产品类增多,类文件会增大.
- -
UML类图
- AbstractFactory:抽象工厂
/**
- 抽象工厂,返回抽象产品
- @author max
- @date 2016年2月18日
- */
public abstract class AbstractFactory {
/**
* @return AbstractProduct 返回任意继承抽象产品的子类对象
*/
public abstract AbstractProduct createProduct();
}
- AbstractProduct:抽象产品父类
/**
* 抽象产品,不同的种类产品,创建不同的抽象父类
* @author max
* @date 2016年2月18日
* */
public abstract class AbstractProduct {
/*
* 用于创建一种产品的方法
*/
public abstract void method();
}
- ConcreteFactory:体工厂类
/**
* 具体工厂类,
* 作用:可以生成不同的子类产品
* @author max
* @date 2016年2月18日
*
*/
public class ConcreteFactory extends AbstractFactory{
@Override
public AbstractProduct createProduct() {
return new ConcreteProduct();//这里可以返回任意继承该抽象父类的子类
}
}
- ConcreteProduct:具体产品角色
/**
* 具体产品角色,可以有多个子类产品
* @author max
*
*/
public class ConcreteProduct extends AbstractProduct{
@Override
public void method() {
//这只是其中一种子类产品,如果需要其他子类产品,那么就需要去新建一个类
//去继承父类,因此也暴露也该模式的缺点,子类种类过多,类文件冗余
}
}
- 使用场景:
/**
* 具体simple案例
*/
private void simple() {
//想制造哪种商品,就new 对应的子类对象,这里可以有多个子类,这里为了方便看,就只写一个子类
AbstractFactory factory = new ConcreteFactory();
factory.createProduct().method();//生成任意产品类,这里可以有多个子类,这里为了方便看,就只写一个子类
}