抽象工厂模式(Abstract Factory Pattern)是GoF设计模式中的一种创建型模式,它提供了一种方式来封装一系列相关或相互依赖对象的创建,而无需指定它们具体的类。抽象工厂模式通常用于系统中存在多个产品系列或者产品家族的情况。
抽象工厂模式的组成部分:
- 抽象工厂(Abstract Factory):这是一个接口,声明了一系列用于创建各种相关或依赖对象的方法,而不指定它们具体的类。
- 具体工厂(Concrete Factory):实现了抽象工厂接口,并包含了一组用于创建特定产品族中对象的方法。
- 抽象产品(Product Interface):每个产品族中的对象都有一个相应的接口或抽象类,定义了产品的行为。
- 具体产品(Concrete Product):实现了抽象产品接口,由具体工厂创建,代表了产品族中的实际对象。
抽象工厂模式的优点:
- 系统的独立性:客户端代码仅依赖于抽象接口,这使得系统更易于维护和扩展。
- 易于交换产品系列:可以在运行时选择不同的产品系列,只要它们遵循相同的抽象工厂接口即可。
- 遵循“开闭原则”:当需要添加一个新的产品系列时,只需添加一个新的具体工厂和相应的产品类,而不需要修改现有代码。
使用场景:
- 当你需要创建一组相关的产品,但不确定具体产品类型时。
- 当你希望将创建一组相关对象的责任分离出来,以便将来可能改变或扩展产品系列时。
- 当你需要一个产品系列中的产品协同工作时。
示例代码:
假设我们有一个汽车制造商的例子,其中包含两种类型的汽车:经济型和豪华型,每种汽车都有其对应的轮胎和引擎。
// 抽象产品
interface Tire {}
class EconomyTire implements Tire {}
class LuxuryTire implements Tire {}
interface Engine {}
class EconomyEngine implements Engine {}
class LuxuryEngine implements Engine {}
// 抽象工厂
interface CarFactory {
Tire createTire();
Engine createEngine();
}
// 具体工厂
class EconomyCarFactory implements CarFactory {
@Override
public Tire createTire() {
return new EconomyTire();
}
@Override
public Engine createEngine() {
return new EconomyEngine();
}
}
class LuxuryCarFactory implements CarFactory {
@Override
public Tire createTire() {
return new LuxuryTire();
}
@Override
public Engine createEngine() {
return new LuxuryEngine();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
CarFactory factory;
// 假设这里通过配置或其他方式决定使用哪种工厂
if (args[0].equals("economy")) {
factory = new EconomyCarFactory();
} else {
factory = new LuxuryCarFactory();
}
Tire tire = factory.createTire();
Engine engine = factory.createEngine();
// 使用创建的产品
}
}
在这个例子中,CarFactory
是抽象工厂,EconomyCarFactory
和LuxuryCarFactory
是具体工厂,而Tire
和Engine
是抽象产品,EconomyTire
、LuxuryTire
、EconomyEngine
和LuxuryEngine
是具体产品。