前期概念
产品等级结构:产品的继承结构,例如一个抽象类(或接口类)是电视机,其子类(或实现类)是海尔电视机/海信电视机、TCL电视机,则抽象电视机和某一具体品牌电视机之间构成了一个产品等级结构,抽象电视机是父类(或接口),具体品牌电视机是子类(或实现类)
产品族:在抽象工厂模式中,产品族指的是由同一个工厂生产的,位于不同产品等级结构的一组产品,例如海尔电器厂生产的海尔电视机、海尔电冰箱等构成一个产品族。
定义
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。它是一种对象创建型模式。
它为创建一组对象提供了一种解决方案,与工厂方法模式相比,抽象工厂中的具体工厂不只是创建一种产品,它负责创建一族产品。
UML示例
代码示例
按钮产品结构
// 按钮接口
public interface Button {
public void display();
}
// spring 按钮类:具体产品
public class SpringButton implements Button{
public void display() {
System.out.println("显示浅绿色按钮");
}
}
// Summer 按钮类:具体产品
public class SummerButton implements Button{
public void display() {
System.out.println("显示浅蓝色按钮");
}
}
文本框产品结构
// 文本框接口:抽象产品
public interface TextField {
public void display();
}
// Spring文本框类:具体产品
public class SpringTextField implements TextField{
public void display() {
System.out.println("显示绿色文本框");
}
}
// Summer 文本框类:具体产品
public class SummerTextField implements TextField{
public void display() {
System.out.println("显示蓝色文本框");
}
}
组合框产品结构
// 组合框接口:抽象产品
public interface ComboBox {
public void display();
}
// Spring 组合框类:具体产品
public class SpringComBox implements ComboBox{
public void display() {
System.out.println("显示绿色组合框");
}
}
// Summer组合框类:具体产品
public class SummerComboBox implements ComboBox{
public void display() {
System.out.println("显示蓝色组合框");
}
}
皮肤工厂
// 界面皮肤工厂接口:抽象工厂
public interface SkinFactory {
public Button createButton();
public TextField createTextField();
public ComboBox createComboBox();
}
// Spring皮肤工厂:具体工厂
public class SpringSkinFactory implements SkinFactory{
public Button createButton() {
return new SpringButton();
}
public TextField createTextField() {
return new SpringTextField();
}
public ComboBox createComboBox() {
return new SpringComBox();
}
}
// Summer皮肤工厂:具体工厂
public class SummerSkinFactory implements SkinFactory{
public Button createButton() {
return new SummerButton();
}
public TextField createTextField() {
return new SummerTextField();
}
public ComboBox createComboBox() {
return new SummerComboBox();
}
}
客户端
// 客户端代码
public class SkinClient {
public static void main(String[] args) {
SkinFactory factory;
Button bt;
TextField tf;
ComboBox cb;
factory = new SummerSkinFactory;
bt = factory.createButton();
tf = factory.createTextField();
cb = factory.createComboBox();
bt.display();
tf.display();
cb.display();
}
}
输出:
显示浅蓝色按钮
显示蓝色文本框
显示蓝色组合框