在了解抽象工厂模式以前,首先来了解一下两个术语:java
产品等级结构也就是产品的继承结构,例如一个抽象类是电视机,子类有不一样品牌的电视机,好比海尔电视机,海信电视机,TCL电视机,而抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是子类。ide
产品族是指由一个同一个工厂产生的位于不一样产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视机,海尔电冰箱。海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机与海尔电冰箱共同构成了一个产品族。测试
二者示意图以下:设计
抽象工厂模式:提供一个建立一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
抽象工厂模式又叫Kit模式,是一种对象建立型模式。3d
结构图以下:code
抽象工厂模式包含四个角色:对象
界面皮肤库设计:开发一套皮肤库,用户能够经过菜单选择皮肤,不一样的皮肤提供视觉不一样的按钮,文本框等UI元素。blog
这里简单起见假设开发两套皮肤:继承
每套皮肤具备如下UI元素:接口
首先是UI元素,包括抽象元素以及具体元素:
interface Button { void display(); } class SpringButton implements Button { public void display() { System.out.println("春季皮肤按钮"); } } class SummerButton implements Button { public void display() { System.out.println("夏季皮肤按钮"); } } interface TextField { void display(); } class SpringTextField implements TextField { public void display() { System.out.println("春季皮肤文本框"); } } class SummerTextField implements TextField { public void display() { System.out.println("夏季皮肤文本框"); } } interface ComboBox { void display(); } class SpringComboBox implements ComboBox { public void display() { System.out.println("春季皮肤组合框"); } } class SummerComboBox implements ComboBox { public void display() { System.out.println("夏季皮肤组合框"); } }
接着是工厂类,包括抽象工厂以及具体工厂:
interface SkinFactory { Button createButton(); TextField createTextField(); ComboBox createComboBox(); } class SpringSkinFactory implements SkinFactory { public Button createButton() { return new SpringButton(); } public TextField createTextField() { return new SpringTextField(); } public ComboBox createComboBox() { return new SpringComboBox(); } } class SummerSkinFactory implements SkinFactory { public Button createButton() { return new SummerButton(); } public TextField createTextField() { return new SummerTextField(); } public ComboBox createComboBox() { return new SummerComboBox(); } }
测试:
public class Test { public static void main(String[] args) { SkinFactory factory = new SpringSkinFactory(); factory.createButton().display(); factory.createTextField().display(); factory.createComboBox().display(); factory = new SummerSkinFactory(); factory.createButton().display(); factory.createTextField().display(); factory.createComboBox().display(); } }
虽然使用抽象工厂模式增长新的皮肤界面很是方便,可是若是增长一个UI元素,会修改大量的代码,须要修改抽象工厂以及每个具体工厂类,也就是说,不可以在符合OCP(开放闭合原则)的前提下增长新的组件。
这是抽象工厂模式的最大缺点,尽管增长新的产品族(这里是皮肤)很是方便,可是增长新的产品等级结构(这里是UI元素)很麻烦。抽象工厂模式的这种性质叫作开闭原则的倾斜性。所以设计人员在设计之初须要全面考虑,不然新增产品结构会致使大量的代码修改。
主要缺点是增长新的产品等级结构麻烦,须要对系统进行大量的修改,违背了OCP