介绍
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
优缺点
优点:
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景
1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
举例
一个奥迪造车工厂生产Q3、Q5和Q7,虽然属于一个车系,但是三者之间零部件差别却很大,比如Q3和Q7的发动机、轮胎、制动系统都不同。这时候就需要将抽象工厂模式应用到其中。 首先,为每一种零部件产品定义一个接口,并分别创建两个不同的实现类表示不同的零部件产品。 轮胎相关类
public interface ITire {
void tire();
}
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 interface IEngine {
void engine();
}
public class DomesticEngine implements IEngine {
@Override
public void engine() {
System
.out
.println("国产发动机");
}
}
public class ImportEngine implements IEngine {
@Override
public void engine() {
System
.out
.println("进口发动机");
}
}
制动系统相关类
public interface IBrake {
void brake();
}
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 abstract class CarFactory {
public abstract ITire
createTire();
public abstract IEngine
creatEngine();
public abstract IBrake
createBrake();
}
public class Q3Factory extends CarFactory {
@Override
public ITire
createTire() {
return new NormalTire();
}
@Override
public IEngine
creatEngine() {
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
creatEngine() {
return new ImportEngine();
}
@Override
public IBrake
createBrake() {
return new SeniorBrake();
}
}
客户类
public class Client {
public static void main(String
[] args
) {
CarFactory factoryQ3
= new Q3Factory();
factoryQ3
.createTire().tire();
factoryQ3
.creatEngine().engine();
factoryQ3
.createBrake().brake();
CarFactory factoryQ7
= new Q7Factory();
factoryQ7
.createTire().tire();
factoryQ7
.creatEngine().engine();
factoryQ7
.createBrake().brake();
}
}