定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
在该模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品。,这些产品构成一个产品族。
角色
AbstractFactory(抽象工厂)
声明一组用于创建一类产品的方法,每一个方法对应一种产品。
public interface AbstractFactoty {
Button createButton();
TextField createTextField();
}
复制代码
ConcreteFactory(具体工厂)
实现抽象工厂中的方法,生成一组具体产品,这些产品构成了一个产品族。
public class BlueConcreteFactory implements AbstractFactoty {
@Override
public Button createButton() {
return new BlueButton();
}
@Override
public TextField createTextField() {
return new BlueTextField();
}
}
复制代码
public class GreenConcreteFactory implements AbstractFactoty {
@Override
public Button createButton() {
return new GreenButton();
}
@Override
public TextField createTextField() {
return new GreenTextField();
}
}
复制代码
AbstractProduct(抽象产品)
声明每种产品所具有的业务方法。
public interface Button {
void display();
}
复制代码
public interface TextField {
void displayTextField();
}
复制代码
ConcreteProduct(具体产品)
实现抽象产品中的业务方法。
public class BlueButton implements Button {
@Override
public void display() {
System.out.println("我是蓝色按钮");
}
}
复制代码
public class BlueTextField implements TextField {
@Override
public void displayTextField() {
System.out.println("我是蓝色文本框");
}
}
复制代码
public class GreenButton implements Button {
@Override
public void display() {
System.out.println("我是绿色按钮");
}
}
复制代码
public class GreenTextField implements TextField {
@Override
public void displayTextField() {
System.out.println("我是绿色文本框");
}
}
复制代码
客户类
public class AbstractFactoryClient {
public static void main(String[] args) {
AbstractFactoty abstractFactoty;
Button button;
TextField textField;
abstractFactoty = new BlueConcreteFactory();
button = abstractFactoty.createButton();
textField = abstractFactoty.createTextField();
button.display();
textField.displayTextField();
}
}
复制代码
测试结果:
我是蓝色按钮
我是蓝色文本框
复制代码
缺点
修改产品等级结构,(譬如实例中增加其他组件等)对整体代码的修改量较大。
适用场景
(1)系统对其依赖的产品的细节不注重。
(2)系统中有多于一个的产品族。
(3)产品等级结构稳定。