设计模式–抽象工厂模式
1 定义
为了给客户端提供一组相关或者相互依赖的对象提供一个接口,而不用指定它们具体的类。
定义总是抽象的,记点自己的理解。
普通的工厂方法模式,工厂生产的一类相似的产品,比如说生产鞋的工厂、生产裤子的工厂、生产上衣的工厂。通过调用具体工厂类的创建方法并传入参数就可得到我们想要的产品,如生产鞋的具体工厂,传入对应颜色就可以得到指定颜色的鞋子。特点是每个工厂只有一个创建产品的接口方法。
抽象工厂模式,工厂生产一组相关的产品,同样拿服饰来举例,之前是单品工厂,现在需要套装,一个工厂中鞋子、裤子、衣服都要有,显然这些相关性大于相似性。所以这里的工厂要有三个创建方法,分别返回鞋子、裤子、衣服。如:生产运动套装的具体工厂,鞋子、裤子、衣服的具体实现都确定了,只能是运动鞋、运动裤、运动服,不会是其他类型。
2 主要角色
- 抽象产品:定义了一类产品的共有特征。
- 具体产品:定义了每类抽象产品的具体实现。
- 抽象工厂:包含一组相关的抽象产品的创建接口。
- 具体工厂:根据具体工厂类型,实现相关产品创建细节。
3 实践
// 三个抽象产品接口
public interface IBrake {
void brake();
}
public interface IEngine {
void engine();
}
public interface ITire {
void tire();
}
// 具体产品
public class NormalBrake implements IBrake {
@Override
public void brake() {
System.out.println("普通制动");
}
}
public class SeniorBrake implements IBrake {
@Override
public void brake() {
System.out.println("高级制动");
}
}
public class ImportEngine implements IEngine {
@Override
public void engine() {
System.out.println("进口发动机");
}
}
public class NormalTire implements ITire {
@Override
public void tire() {
System.out.println("普通轮胎");
}
}
public class SUVTire implements ITire {
@Override
public void tire() {
System.out.println("越野轮胎");
}
}
// 抽象工厂
public abstract class CarFactory {
public abstract ITire createTire();
public abstract IEngine createEngine();
public abstract IBrake createBrake();
}
// 具体工厂
public class Q3Factory extends CarFactory {
@Override
public ITire createTire() {
return new NormalTire();
}
@Override
public IEngine createEngine() {
return new DomesticEngine();
}
@Override
public IBrake createBrake() {
return new NormalBrake();
}
}
public class Q7Factory extends CarFactory {
@Override
public ITire createTire() {
return new SUVTire();
}
@Override
public IEngine createEngine() {
return new ImportEngine();
}
@Override
public IBrake createBrake() {
return new SeniorBrake();
}
}