github https://github.com/spring2go/core-spring-patterns.git
问题域
- 相关产品家族
- 电器设备工厂
- 电扇Fan
- 日光灯TubeLight
- 开关Switch
- 不同风格产品家族
- 中国电器设备厂(China)
- 美国电器设备分厂(US)
定义
- 提供一个接口,用于制造一族相关或者相互依赖的产品,无需指定具体的实现类。
- 创建工厂的工厂
关系图
产品 电扇接口
public interface IFan {
public void swithOn();
public void switchOff();
}
电器 工厂接口
- 生产风扇
- 生产日光灯
public interface IElectricalFactory {
IFan createFan();
ITubeLight createTubeLight();
}
中国工厂和产品实现
// 中国制造的风扇
public class ChineseFan implements IFan {
public void swithOn() {
System.out.println("The ChineseFan is swithed on ...");
}
public void switchOff() {
System.out.println("The ChineseFan is swithed off ...");
}
}
// 中国制造的台灯
public class ChineseTubeLight implements ITubeLight {
public void swithOn() {
System.out.println("The ChineseTubeLight is swithed on ...");
}
public void switchOff() {
System.out.println("The ChineseTubeLight is swithed off ...");
}
public void tuneLight() {
System.out.println("The ChineseTubeLight is tuned ...");
}
}
// 中国 电器工厂 实现
public class ChineseElectricalFactory implements IElectricalFactory {
public IFan createFan() {
return new ChineseFan();
}
public ITubeLight createTubeLight() {
return new ChineseTubeLight();
}
}
美国工厂和产品 实现
// 美国制造的风扇
public class USFan implements IFan {
public void swithOn() {
System.out.println("The USFan is swithed on ...");
}
public void switchOff() {
System.out.println("The USFan is swithed off ...");
}
}
// 美国制造的 日光灯
public class USTubeLight implements ITubeLight {
public void swithOn() {
System.out.println("The USTubeLight is swithed on ...");
}
public void switchOff() {
System.out.println("The USTubeLight is swithed off ...");
}
public void tuneLight() {
System.out.println("The USTubeLight is tuned ...");
}
}
// 美国 电器工厂的 实现
public class USElectricalFactory implements IElectricalFactory {
public IFan createFan() {
return new USFan();
}
public ITubeLight createTubeLight() {
return new USTubeLight();
}
}
客户端调用
public class AbstractFactoryMain {
public static void main(String[] args) {
// 中国 电器工厂 出来的产品都是中国风格的产品
IElectricalFactory electricalFactory = new ChineseElectricalFactory();
IFan fan = electricalFactory.createFan();
fan.swithOn();
// 美国 电器工厂 出来的产品都是美国风格的产品
electricalFactory = new USElectricalFactory();
ITubeLight tubeLight = electricalFactory.createTubeLight();
tubeLight.swithOn();
tubeLight.tuneLight();
}
}
好处
- 解耦
- 客户代码和具体产品解耦
- 产品家族之间解耦
- 比工厂模式更高层的设计模式
- 标准化产品构造流程
- 易于替换产品家族
Spring框架应用
- FactoryBean 接口基于抽象工厂模式
- ProxyFactoryBean
- JndiFactoryBean
- LocalSessionFactoryBean
- LocalContainerEntityManagerFactoryBean
- 构造具有很多依赖的复杂对象
- 构造逻辑易变且依赖于配置