定义
提供一个创建一系列相关或者相互依赖的类的工厂接口,他包含多个产品类的工厂方法,及一个工厂类能够创建多个产品。
结构图
角色与理解
- 抽象工厂模式总共包含如下四种角色:
-
- AbstractFactory(抽象工厂):包含多个创建同一产品族中产品的抽象工厂方法的抽象类,一个抽象工厂定义了一个输出的产品族
- ConcreteFactory(具体工厂):抽象工厂的实现
- AbstractProduct(抽象产品):所有具体产品的父类,这里指单一产品的父类而不是一个产品族的共同父类
- ConcreteProduct(具体产品):具体的产品
- 实际上抽象工厂模式与工厂方法模式抽象产品与具体产品的角色是一致的,不同的只是工厂定义的不同,工厂方法中的工厂只生产单一产品,而抽象工厂的工厂生产的是一个产品族的产品
核心代码
抽象产品
public interface Button {
void display();
}
public interface ComboBox {
void display();
}
public interface TextField {
void display();
}
具体产品
public class SpringButton implements Button {
@Override
public void display() {
System.out.println("按钮显示绿色");
}
}
public class SpringComboBox implements ComboBox {
@Override
public void display() {
System.out.println("勾选框显示绿色");
}
}
public class SpringTextField implements TextField {
@Override
public void display() {
System.out.println("文本域显示绿色");
}
}
抽象工厂
public interface SkinFactory {
Button createButton();
ComboBox createComboBox();
TextField createTextField();
}
public abstract class AbstractSkinFactory implements SkinFactory{
}
具体工厂
public class SpringSkinFactory extends AbstractSkinFactory {
@Override
public Button createButton() {
System.out.println("创建绿色按钮");
return new SpringButton();
}
@Override
public ComboBox createComboBox() {
System.out.println("创建绿色勾选框");
return new SpringComboBox();
}
@Override
public TextField createTextField() {
System.out.println("创建绿色文本域");
return new SpringTextField();
}
}
客户端
public class Client {
public static void main(String[] args) {
AbstractSkinFactory abstractSkinFactory = new SpringSkinFactory();
Button button = abstractSkinFactory.createButton();
ComboBox comboBox = abstractSkinFactory.createComboBox();
TextField textField = abstractSkinFactory.createTextField();
button.display();
comboBox.display();
textField.display();
}
}