设计模式之抽象工厂模式

上一篇文章写了简单工厂模式和工厂方法模式,接下了的是抽象工厂模式,抽象工厂模式用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)。抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值