抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。抽象工厂模式通过将对象的创建委托给工厂类来实现,客户端不需要直接实例化具体的类,而是通过与抽象工厂接口进行交互,从而实现解耦和灵活性。
抽象工厂模式包含以下几个角色:
1. 抽象工厂(Abstract Factory):定义创建对象的接口,通常包含多个创建对象的方法。
2. 具体工厂(Concrete Factory):实现抽象工厂接口,负责创建具体的产品对象。
3. 抽象产品(Abstract Product):定义了产品的公共接口。
4. 具体产品(Concrete Product):实现抽象产品接口,具体的产品对象通过具体工厂创建。
下面以一个汽车工厂的例子来说明抽象工厂模式:
首先,我们定义了抽象工厂接口`AbstractCarFactory`,其中有两个创建方法`createEngine()`和`createTire()`用于创建引擎和轮胎。
public interface AbstractCarFactory {
Engine createEngine();
Tire createTire();
}
然后,我们定义了两个具体工厂类`BenzFactory`和`BMWFactory`,分别实现了`AbstractCarFactory`接口,并负责创建奔驰和宝马车型的引擎和轮胎。
public class BenzFactory implements AbstractCarFactory {
@Override
public Engine createEngine() {
return new BenzEngine();
}
@Override
public Tire createTire() {
return new BenzTire();
}
}
public class BMWFactory implements AbstractCarFactory {
@Override
public Engine createEngine() {
return new BMWEngine();
}
@Override
public Tire createTire() {
return new BMWTire();
}
}
接下来,我们定义了抽象产品接口`Engine`和`Tire`,并分别有奔驰和宝马的具体产品实现。
public interface Engine {
void start();
void stop();
}
public class BenzEngine implements Engine {
@Override
public void start() {
System.out.println("Benz Engine starts.");
}
@Override
public void stop() {
System.out.println("Benz Engine stops.");
}
}
public class BMWEngine implements Engine {
@Override
public void start() {
System.out.println("BMW Engine starts.");
}
@Override
public void stop() {
System.out.println("BMW Engine stops.");
}
}
public interface Tire {
void roll();
}
public class BenzTire implements Tire {
@Override
public void roll() {
System.out.println("Benz Tire is rolling.");
}
}
public class BMWTire implements Tire {
@Override
public void roll() {
System.out.println("BMW Tire is rolling.");
}
}
最后,我们可以使用抽象工厂模式来创建具体的产品,例如:
public class Main {
public static void main(String[] args) {
AbstractCarFactory factory1 = new BenzFactory();
Engine benzEngine = factory1.createEngine();
Tire benzTire = factory1.createTire();
benzEngine.start();
benzTire.roll();
AbstractCarFactory factory2 = new BMWFactory();
Engine bmwEngine = factory2.createEngine();
Tire bmwTire = factory2.createTire();
bmwEngine.start();
bmwTire.roll();
}
}
输出结果为:
Benz Engine starts.
Benz Tire is rolling.
BMW Engine starts.
BMW Tire is rolling.
通过抽象工厂模式,我们可以根据具体工厂的选择来创建不同品牌的汽车引擎和轮胎,而不需要直接实例化具体的产品类。这样,我们可以方便地扩展产品系列,只需要新增对应的具体工厂和产品类即可,同时保持了客户端与具体产品的解耦。
领取专属 10元无门槛券
私享最新 技术干货