什么是抽象工厂模式
定义:抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口。
对比 简单工厂、工厂方法、抽象工厂
模式 | 优点 | 缺点 |
---|---|---|
简单工厂 | 将创建对象的逻辑封装在一个静态方法中,外部人员不需要关注内部实现逻辑 | 创建对象的逻辑存在一个静态方法中不方便扩展、不能被继承、违背开闭原则 |
工厂方法 | 通过提供多个工厂类来创建不同对象,解决了简单工厂模式中职责过重问题,方便扩展、可以被继承、符合开闭原则 | 对象太多的时候就会创建很多工厂类 |
抽象工厂 | 通过提供多个工厂类来创建同一产品族对象,方便扩展、可以被继承、符合开闭原则,并且减少了工厂类数量 | 实现起来比较复杂,不如简单工厂模式使用简单,产品族需要划分 |
下面通过一个例子来实现抽象工厂模式。
需求描述
宝马品牌车有宝马X1、X3、X5等系列,每个系列车又配有各自的系列车标X1、X3、X5(车标只能由自己工厂创建),这三个系列车和车标分别由三个工厂创建,下面通过抽象工厂模式来实现该例子。
UML图
IBMWFactory接口定义了createCar(生产车)和createLogo(生产车标)方法,X1Factory、X3Factory、X5Factory造车工厂实现该接口,同时提供生产车型和车标的方法。
X1Car、X3Car、X5Car都实现实体BMWCar接口,并实现run方法。
代码实现
创建系列车类
创建IBMWCar接口,并定义run方法。
public interface IBMWCar {
void run();
}
创建宝马X1车类,并实现IBMWCar接口,实现run方法。
public class X1Car implements IBMWCar {
@Override
public void run() {
System.out.println("X1Car run");
}
}
创建宝马X3车类,并实现IBMWCar接口,实现run方法。
public class X3Car implements IBMWCar {
@Override
public void run() {
System.out.println("X3Car run");
}
}
创建宝马X5类,并实现IBMWCar接口,实现run方法。
public class X5Car implements IBMWCar {
@Override
public void run() {
System.out.println("X5Car run");
}
}
创建Logo车标类
创建ILogo接口,并定义create方法。
public interface ILogo {
void