上一篇文章写了简单工厂模式和工厂方法模式,接下了的是抽象工厂模式,抽象工厂模式用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)。抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
1、在什么情况下应当使用抽象工厂模式
1.1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
1.2、这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
1.3、同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。(比如:特斯拉的汽车需要动力必须使用电机,奔驰汽车需要动力必须使用汽油发动机)
1.4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
public interface Engine
{
void run();
void start();
}
public interface CarFactory
{
Engine createEngine();
}
public class TeslaEngine implements Engine
{
@Override
public void run() {
System.out.println("最高时速320公里/小时");
}
@Override
public void start() {
System.out.println("电机正在启动");
}
}
public class TeslaFactory implements CarFactory
{
@Override
public Engine createEngine() {
return new TeslaEngine();
}
}
public class BenzEngine implements Engine
{
@Override
public void run() {
System.out.println("最高时速220公里/小时");
}
@Override
public void start() {
System.out.println("汽油发动机正在启动");
}
}
public class BenzFactory implements CarFactory
{
@Override
public Engine createEngine() {
return new BenzEngine();
}
}
2、抽象工厂模式的起源
抽象工厂模式的起源或者最早的应用,是用于创建分属于不同操作系统的视窗构建。比如:命令按键(Button)与文字框(Text)都是视窗构建,在UNIX操作系统的视窗环境和Windows操作系统的视窗环境中,这两个构建有不同的本地实现,它们的细节有所不同。在每一个操作系统中,都有一个视窗构建组成的构建家族。在这里就是Button和Text组成的产品族。而每一个视窗构件都构成自己的等级结构,由一个抽象角色给出抽象的功能描述,而由具体子类给出不同操作系统下的具体实现。
3、抽象工厂模式的优点
分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。
4、抽象工厂模式的缺点
不太容易扩展新的产品
如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
5、工厂模式要点:
– 简单工厂模式(静态工厂模式)
• 虽然某种程度不符合设计原则,但实际使用最多。
– 工厂方法模式
• 不修改已有类的前提下,通过增加新的工厂类实现扩展。
– 抽象工厂模式
• 不可以增加产品,可以增加产品族!
6、git
https://gitee.com/leungzengjian/GOF23/tree/master/src/AbstractFactory