抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。抽象工厂模式通过将对象的创建委托给工厂类来实现,客户端不需要直接实例化具体的类,而是通过与抽象工厂接口进行交互,从而实现解耦和灵活性。
抽象工厂模式包含以下几个角色:
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元无门槛券
私享最新 技术干货