概念
提供一个创建一系列相关或相互依赖对象的接口。而无须指定它们的具体的类。
抽象工厂模式与工厂模式的区别在于:工厂模式是针对一个产品的等级结构,而抽象工厂模式针对的是多个产品的等级结构。简单来说,在我们生产空调时,不同的空调可能会有不同的能效,相对于空调的不同能效的生产,但它仅仅是只针对空调;是工厂方法模式的特点。然而抽象工厂可以比喻为:一个品牌公司,它既生产空调,又生产冰箱和电视机等等,这些并不属于同个种类,但它都由这个公司生产。 再这种品牌多产品的场景下,虽然我们用工厂方法模式也能解决这种需求,但此时抽象工厂模式会比它更简单,更有效率。
实例
我们假设一个场景,帮助我们去理解抽象工厂模式
某一天,
公司聪明的产品锦鲤表示要你开发一套系统,根据摄像头识别用户手机的颜色,变换系统的按钮,以及文本输入框的颜色,让用户有一种身临其境,实现人机APP合一的体验感。聪明绝顶领导咔咔咔完成了识别用户手机颜色的功能,并把接下来的任务交由给你开发,要你当得到绿色手机壳时,使用春天主题,把按钮和文本框变成__绿色__,当得到白色时,使用冬天主题,把按钮和文本框变成 白色,这个时候我们采用抽象工厂模式来开发,得到了领导的夸奖。
- 首先,我们先写一个按钮、文本框接口
public interface Button {
public void display();
}
public interface TextField {
public void display();
}
- 我们需要的按钮和文本框分别有两种颜色,绿色和白色
public class GreenButton implements Button {
public void display() {
System.out.println("我是绿色的按钮");
}
}
public class WhiteButton implements Button {
public void display() {
System.out.println("我是白色的按钮");
}
}
public class GrennTextField implements TextField {
public void display() {
System.out.println("我是一个绿色的文本框");
}
}
public class WhiteTextField implements TextField {
public void display() {
System.out.println("我是一个白色的文本框");
}
}
- 我们在拧出个主题工厂接口
public interface ThemeFactory {
public Button createButton();
public TextField createTextField();
}
- 最后我们实现不同主题
public class SpringThemeFactory implements ThemeFactory {
public Button createButton() {
return new GreenButton();
}
public TextField createTextField() {
return new GreenTextField();
}
}
public class WinterThemeFactory implements ThemeFactory {
public Button createButton() {
return new WhiteButton();
}
public TextField createTextField() {
return new WhiteTextField();
}
}
- 最后的最后,我们让客户用上它
public class Client {
public static void main(String args[]) {
ThemeFactory theme;
Button button;
TextField tf;
theme = new GreenTheme();
button = theme.createButton();
tf = theme.createTextField();
button.display();
tf.display();
}
}
以上实现方式,我们分析一个抽象工厂模式的构成:
- 抽象产品(AbstractProduct):为每种产品声明接口,声明产品具有的业务方法。上例中的TextField和Button都属于抽象产品。
- 具体产品(ConcreteProduct):实现抽象产品声明中的业务方法。上例中GreenButton、WhiteButton、GreenTextField、WhiteTextField属于具体产品。
- 抽象工厂(AbstractFactory):声明一组用于创建一组产品的方法。每个方法对应一种产品。上例中的ThemeFactory属于抽象工厂。
- 具体工厂(ConcreteFactory):实现了抽象工厂声明的创建产品的方法,生成一组具体产品。上例中WhiteThemeFactory和GreenThemeFactory属于具体工厂。
缺点
- 增加新的产品等级结构比较困难,例如我们需要增加主题单选按钮的样式,后就会发现我们需要对系统进行较大的修改,违背了开闭原则。
适用场景
- 系统中存在多个产品组,通过不同的产品组合不同的产品组。
- 由不同产品组成一个大的产品,这些不同的产品没有直接的关联性。
- 产品等级结构稳定,设计完成后不会再向系统中增加新的产品等级结构或者删除已有的产品等级结构。
上期答案
B
一问三不知
以下关于抽象工厂模式的叙述错误的是()。
A. 抽象工厂模式提供了一个创建一系列相关或互相依赖对象的接口,而无须指定它们的具体的类
B. 抽象工厂模式符合开闭原则,增加新的产品族和新的产品等级结构都很方便
C. 当系统中有多于一个产品族时可以考虑使用抽象工厂模式
D. 当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率