本文转载自微信公众号「花括号MC」,作者花括号MC。转载本文请联系花括号MC公众号。
抽象工厂提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。简单来说是为需要创建多个相关联产品的场景提供了解决思路。
举个例子
很多软件都支持配置不同的颜色的主题,当切换主题时,所有按钮样式和颜色都会统一切换。
假设我们的软件只有三类按钮,分别是Button, TextField,以及ComboBox,并且我们的软件只提供两类主题,即红色主题和绿色主题。
来看一下UML :
再来看一下具体代码如何实现。
先来创建一个SkinFactory接口
- public interface SkinFactory {
- Button createButton();
- TextField createTextField();
- ComboBox createComboBox();
- }
通过实现SkinFactory实现绿色主题工厂
- //红色主题工厂
- public class RedSkinFactory implements SkinFactory {
- @Override
- public Button createButton() {
- return new RedButton();
- }
- @Override
- public TextField createTextField() {
- return new RedTextField();
- }
- @Override
- public ComboBox createComboBox() {
- return new RedComboBox();
- }
- }
红色主题工厂类类似,因为篇幅原因不在单独列出。
来看一下客户端如何使用
- public class Client {
- public static void main(String[] args){
- //通过切换不同工厂,可以达到所有按钮颜色都变换的效果
- SkinFactory skinFactory = new RedSkinFactory();
- Button button = skinFactory.createButton();
- ComboBox comboBox = skinFactory.createComboBox();
- TextField textField = skinFactory.createTextField();
- button.display();
- comboBox.display();
- textField.display();
- }
- }
总结
抽象工厂是创建模式之一,抽象工厂适合创建一系列有相关性的多个产品,虽然抽象工厂在扩展一个主题的按钮时灵活方便,但是也有一定缺点, 最大缺点就是想单独增加一个不属于任何主题的按钮时比较麻烦,比如上面的例子中,如果想增加一个关闭按钮,这个按钮即不属于红色主题也不属于绿主题,那么改动起来就比较复杂。
工厂模式三兄弟:简单工厂适合逻辑简单,创建产品数量很少的场景,工厂模式适合创建独立的产品,抽象工厂适合创建一系列有相关性的多个产品。