抽象工厂模式
一种为访问类提供一个创建一组相关或互相依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
此前的工厂模式中,我们只考虑了一类产品的生产,如咖啡工厂只生产咖啡,芯片厂只生产芯片。
这些工厂只能生产同种类的产品,同种类的产品称为同等级产品,也就是说:工厂方法模式只考虑生产同级的产品,但是我们有时更需要的是综合型工厂,既能生产手机,又能生产电脑,这时就需要引入抽象工厂模式。
结构
- 抽象工厂——提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
- 具体工厂——主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品——定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品——实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
实现
现在我们创建一个咖啡店,它不只是能生产咖啡,还能生产各种甜点,如果按照传统的工厂方法模式,我们需要定义所有咖啡、甜品的工厂类,很容易就会发生类爆炸的情况。
现在我们为各个产品划分等级和产品族:
产品等级划分
咖啡:
- 拿铁咖啡
- 美式咖啡
甜品:
- 提拉米苏
- 抹茶慕斯
产品族划分
意大利风味:
- 拿铁
- 提拉米苏
美式风味:
- 美式咖啡
- 抹茶慕斯
于是我们的设计就很清晰了:
分别定义了甜品和咖啡类,供同等级产品类继承
而下方的工厂分别为美式风味工厂和意大利风味工厂,分别用来创建不同族的产品,他们共同实现一个productFactory接口,接口中规定了不同等级产品生产的方法
//通用接口DessertFactory
public interface productFactory {
//生产咖啡的方法
public Coffee createCoffee();
//生产甜点的方法
public Dessert createDessert();
}
创建同族产品的工厂:
//美式风味工厂 AmericanProductFactory
public AmericanProductFactory implements productFactory {
//生产美式咖啡
public Coffee createCoffee(){
return new AmericanCoffee()
};
//生产抹茶慕斯
public Dessert createDessert(){
return new MetchaMousse();
};
}
意大利风味工厂同理,不赘述
优缺点
优点
当前一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点
当产品族中需要增加一个新产品时,所有工厂类都需要进行修改。
使用场景
- 当需要创建的对象是一系列相互关联或者依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
- 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢某一个品牌的衣服和鞋,或者某一个品牌的手机或电脑。
- 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。
例如输入法的皮肤,一换整套一起换,生成不同操作系统的程序。