抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
产品族和产品等级是抽象工厂模式中的两个重要概念,它们描述了产品之间的关系。
产品族(Product Family):产品族指的是一组相关的、相互依赖的产品集合。这些产品可能是相互关联的,用于完成特定的任务或在特定的环境下工作。比如,在汽车工厂中,不同品牌(奥迪、宝马)的汽车零部件(发动机、轮胎)组成了不同的产品族。这些产品族共享某些相似性,比如它们都是用于组装汽车的零部件。
产品等级(Product Level):产品等级指的是一个产品族中的产品集合。这些产品在某种程度上是相互独立的,但它们又共享一些公共特征。在汽车工厂的例子中,发动机和轮胎属于不同的产品等级,因为它们虽然在不同的系统中工作,但都是汽车的组成部分。
举例来说,一个汽车工厂的例子。假设我们有不同品牌的汽车(比如奥迪和宝马),每个品牌有自己的发动机和轮胎。
首先,我们定义抽象产品类,包括发动机和轮胎:
// 抽象发动机类
interface Engine {
void design();
}
// 抽象轮胎类
interface Tire {
void manufacture();
}
然后,我们定义具体的发动机和轮胎类:
// 具体奥迪发动机类
class AudiEngine implements Engine {
@Override
public void design() {
System.out.println("Designing Audi Engine");
}
}
// 具体奥迪轮胎类
class AudiTire implements Tire {
@Override
public void manufacture() {
System.out.println("Manufacturing Audi Tire");
}
}
// 具体宝马发动机类
class BMWEngine implements Engine {
@Override
public void design() {
System.out.println("Designing BMW Engine");
}
}
// 具体宝马轮胎类
class BMWTire implements Tire {
@Override
public void manufacture() {
System.out.println("Manufacturing BMW Tire");
}
}
接着,定义抽象工厂接口和具体的工厂类:
// 抽象汽车工厂接口
interface CarFactory {
Engine createEngine();
Tire createTire();
}
// 具体奥迪汽车工厂
class AudiFactory implements CarFactory {
@Override
public Engine createEngine() {
return new AudiEngine();
}
@Override
public Tire createTire() {
return new AudiTire();
}
}
// 具体宝马汽车工厂
class BMWFactory implements CarFactory {
@Override
public Engine createEngine() {
return new BMWEngine();
}
@Override
public Tire createTire() {
return new BMWTire();
}
}
最后,在主程序中使用抽象工厂来创建不同品牌汽车的零部件:
public class Main {
public static void main(String[] args) {
// 创建奥迪汽车工厂
CarFactory audiFactory = new AudiFactory();
Engine audiEngine = audiFactory.createEngine();
Tire audiTire = audiFactory.createTire();
// 创建宝马汽车工厂
CarFactory bmwFactory = new BMWFactory();
Engine bmwEngine = bmwFactory.createEngine();
Tire bmwTire = bmwFactory.createTire();
// 使用零部件
audiEngine.design();
audiTire.manufacture();
bmwEngine.design();
bmwTire.manufacture();
}
}
以上展示了如何使用抽象工厂模式创建不同品牌汽车的零部件,其中每个工厂负责生产属于自己品牌的发动机和轮胎。
优点:
-
一致性:你可以确保同一工厂生成的产品相互匹配。
-
易于替换产品系列:如果需要更换产品族,只需切换具体工厂即可。这种灵活性使得系统更容易扩展和维护。
-
符合单一职责原则:每个具体工厂类负责创建一种产品,符合类的职责单一性原则。
-
遵循开闭原则:抽象工厂模式符合开闭原则,可以轻松地添加新产品族,而无需修改现有代码。
缺点:
- 复杂性增加:随着产品族和产品等级的增加,抽象工厂模式可能变得更加复杂。这可能导致类的数量增加,使得系统更难以理解和维护。
适用场景:
如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂