介绍
抽象工厂模式(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 {
/**
* 生产轮胎
* @return
*/
public abstract ITire createTire();
/**
* 生产发动机
* @return
*/
public abstract IEngine creatEngine();
/**
* 生产制动系统
* @return
*/
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();
}
}