抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种提供接口,用于创建一系列相关或互相依赖对象的工厂模式。抽象工厂模式隐藏了工厂类创建产品的实现,客户端只需通过工厂接口即可创建一系列产品。
抽象工厂模式通常由一个抽象工厂类和多个具体工厂类实现,每个具体工厂类可以创建一系列相关的产品。每个工厂类都有一个对应的产品族,工厂类创建的产品属于同一个产品族。
优点
- 抽象工厂模式将具体产品类的名称从客户端代码中分离出来,使得代码更加松耦合。
- 抽象工厂模式可以在一定程度上提高代码的复用性,例如,多个具体工厂类可以共享同一个抽象工厂类。
- 抽象工厂模式可以在运行时动态更换具体工厂类,从而改变工厂类创建的产品。
缺点
- 抽象工厂模式增加了系统的抽象性和理解难度。
- 在需要增加新的产品族时,需要修改抽象工厂类和所有具体工厂类,不符合“开闭原则”。
- 当产品族中只需增加一个新的产品时,抽象工厂模式需要修改所有的抽象产品类和所有具体产品类。
代码讲解
假设我们需要创建一个由汽车和轮胎组成的产品族。其中汽车分为SUV和轿车两种类型,轮胎分为普通轮胎和越野轮胎两种类型。我们可以使用抽象工厂模式来创建这个产品族。
抽象产品类
public abstract class Car {
public abstract void run();
}
public abstract class Tyre {
public abstract void show();
}
具体产品类
public class SuvCar extends Car {
@Override
public void run() {
System.out.println("SUV run");
}
}
public class SedanCar extends Car {
@Override
public void run() {
System.out.println("Sedan car run");
}
}
public class NormalTyre extends Tyre {
@Override
public void show() {
System.out.println("Normal tyre show");
}
}
public class OffroadTyre extends Tyre {
@Override
public void show() {
System.out.println("Offroad tyre show");
}
}
抽象工厂类
public abstract class AbstractFactory {
public abstract Car createCar();
public abstract Tyre createTyre();
}
具体工厂类
public class SuvFactory extends AbstractFactory {
@Override
public Car createCar() {
return new SuvCar();
}
@Override
public Tyre createTyre() {
return new OffroadTyre();
}
}
public class SedanFactory extends AbstractFactory {
@Override
public Car createCar() {
return new SedanCar();
}
@Override
public Tyre createTyre() {
return new NormalTyre();
}
}
测试代码
public class AbstractFactoryDemo {
public static void main(String[] args) {
AbstractFactory suvFactory = new SuvFactory();
Car suvCar = suvFactory.createCar();
Tyre suvTyre = suvFactory.createTyre();
suvCar.run();
suvTyre.show();
AbstractFactory sedanFactory = new SedanFactory();
Car sedanCar = sedanFactory.createCar();
Tyre sedanTyre = sedanFactory.createTyre();
sedanCar.run();
sedanTyre.show();
}
}
结果输出
SUV run
Offroad tyre show
Sedan car run
Normal tyre show
从输出结果可以看出,使用抽象工厂模式创建了具体的产品,并能够动态地实现产品族的创建和替换。
抽象工厂模式缺点
-
扩展困难:如果需要增加一种产品族,就需要修改抽象工厂接口、所有实现工厂和所有产品的接口实现。
-
代码复杂性:引入了更多的抽象概念,增加了代码的复杂性。
-
不易理解:因为抽象工厂模式要求创建一组相关的对象,所以需要理解这些对象之间的关系。
-
不灵活:因为抽象工厂模式是在编译时确定的,所以不能动态地添加或删除产品族。