大纲
- 抽象工厂模式
抽象工厂模式设计的意图是为了提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
- 结构图
其中:
-
AbstiactFactory声明一个创建抽象产品对象的操作接口。
-
ConcreteFactory实现创建具体产品对象的操作。
-
AbstiactProduct为一类产品对象声明一个接口。
-
ConcieteProduct定义一个将被相应的具体工厂创建的产品对象,实现AbstiactProduct 接口。
-
Client 仅使用由 AbstractFactory 和 AbstractProduct 类声明的接口 。
-
抽象工厂类, 有两个接口,分别用于创建电视和空调
public interface AbstractFactory {
TV getTV();
AirConditioner getAirConditioner();
}
- 创建具体工厂类, 别对应海尔和TCL两家公司,实现具体产品的创建
public class HaierFactory implements AbstractFactory{
@Override
public TV getTV() {
return new HaierTV();
}
@Override
public AirConditioner getAirConditioner() {
return new HaierAirConditioner();
}
}
public class TCLFactory implements AbstractFactory{
@Override
public TV getTV() {
return new TCLTV();
}
@Override
public AirConditioner getAirConditioner() {
return new TCLAirConditioner();
}
}
- 抽象产品类,产品只有电视机和空调两种等级
public interface TV {
void play();
}
public interface AirConditioner {
void heat();
}
- 实现抽象产品接口,为海尔和TCL公司创建具体产品类
public class HaierTV implements TV{
@Override
public void play() {
System.out.println("海尔电视机,销量全国领先");
}
}
public class TCLTV implements TV{
@Override
public void play() {
System.out.println("TCL牌电视机,家家都在看的电视机");
}
}
public class HaierAirConditioner implements AirConditioner{
@Override
public void heat() {
System.out.println("海尔牌空调,制热效果好,省电又省心~");
}
}
public class TCLAirConditioner implements AirConditioner {
@Override
public void heat() {
System.out.println("TCL牌空调,制热效果杠杠的");
}
}
适用场景
- 需要创建的对象是一系列相关或相互依赖的产品族
- 不同环境,需要使用不同产品族(系统中有多个产品族,但每次只使用其中的某一族产品)
- 例如,Java 的 AWT 中的 Button 和 Text 等构件,在 Windows 和 UNIX 中的本地实现是不同的
- 这时,可以使用抽象工厂,创建属于不同操作系统的视窗构件。
开闭原则的倾斜性
-
增加一个产品族,只需要增加一个新的工厂类,无需修改已有的工厂 —— 满足开闭原则
-
增加一个新等级的产品,抽象工厂和具体工厂都需要进行修改 —— 不满足开闭原则
-
这样的现象,被称作开闭原则的倾斜性
-
简单工厂模式
- 从长期的编程习惯总结出来的简单工厂模式,需要调用者传入对象名称,才能为其创建指定的对象
- 新增对象类型时,需要修改已有代码,违背了开闭原则
- 工厂方法模式
- 每个工厂只负责创建一种类型的对象,是对简单工厂模式的升级改造
- 虽然遵守了开闭原则,但是容易工厂类过多,且不支持创建一组相关或相互依赖的对象的场景
- 抽象工厂模式
- 将一组相关或相互依赖的对象,抽象成产品族,每个工厂负责创建一个产品族
- 开闭原则的倾斜性:新增产品族,满足开闭原则;新增产品,不满足开闭原则
评论