设计模式系列| 抽象工厂模式

本文详细介绍了抽象工厂模式,这是一种创建型设计模式,用于在不指定具体类的情况下创建一系列相关对象。适用场景包括处理多个相互关联的产品族。通过实例展示了如何在汽车和船只的高低配置场景中应用抽象工厂模式,分析了其优缺点,并讨论了扩展性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,我是狼王,一个爱打球的程序员

这是设计模式的第三篇,我们都知道「工厂模式」有三种,「简单工厂,工厂方法,抽象工厂」,这篇让我们来认识一下「抽象工厂模式」


1、概述

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。在实现上,抽象工厂是⼀个中心工厂,创建其他⼯厂的模式。

2、适用场景

1)如果有多个相互关联或者相同等级的产品族时,且不明确具体有哪些产品时,出于对代码的扩展考虑,可以使用抽象工厂(比如工厂可以生产汽车和船,但是车和船又分为多种颜色等)。

2)如果有一个抽象类或者接口,它有很多方法做不同的事,基于单一原则,可以考虑将这个抽象类或接口抽象成抽象工厂,方法定义成不同产品族的工厂。

3、实例

业务场景: 一个商店,出售多种货物,包括汽车car,船ship。car和ship都可以运行。要求每个产品有高配high、低配low两种类型。

分析上面的场景,car和ship可以抽象成不同的产品族,高配与低配则可以抽象成工厂方法的类型工厂。

综上我们需要创建以下的类组成一个抽象工厂:1)抽象工厂 2)car顶层接口或抽象类,ship的顶层接口或抽象类 3)高配子工厂和低配子工厂 4)具体的产品,高配car,高配ship,低配car,低配ship

抽象工厂:生产car和ship


public interface AbstractFactory {

    Car getCar();

    Ship getShip();
}

Car和Ship顶层接口:

public interface Car {

    void run();
}

public interface Ship {

    void run();
}

高配子工厂和低配子工厂

public class HighFactory implements AbstractFactory{
    @Override
    public Car getCar() {
        return new HighCar();
    }

    @Override
    public Ship getShip() {
        return new HighShip();
    }
}
public class LowFactory implements AbstractFactory{
    @Override
    public Car getCar() {
        return new LowCar();
    }

    @Override
    public Ship getShip() {
        return new LowShip();
    }
}

创建一个测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes = BsspUserApplication.class)
public class TestDemo {

    @Test
    public void test() {
        //获取高配car
        AbstractFactory highFactory = new HighFactory();
        Car car = highFactory.getCar();
        car.run();
        //获取低配car
        LowFactory lowFactory = new LowFactory();
        Car lowCar = lowFactory.getCar();
        lowCar.run();
    }
}

执行结果

this high car is running
this low car is running

4、分析

「1」通过抽象工厂方式,当需要增加一种产品规格时,比如增加中配,需要增加中配的实际car 和ship,同时增加中配子工厂,对于高配和低配的产品没有任何影响。

「2」增加产品类型时,比如要增加plane,则需要修改抽象工厂,增加获取plane的方法。还要增加顶级产品接口,以及具体的产品。

「3」当扩展子工厂类别时,对于原代码是无影响的;但是增加产品类别时,需要修改抽象工厂;所以在设计时,要选好范围,减少基类的修改。

5、总结

最后总结下上面例子中使用抽象工厂方法的优缺点:

优点:

「符合开闭原则,对扩展开放,对修改关闭。」

「同一工厂下生产的产品相互匹配。」

「符合单一职责,一个类或方法只负责一件事。」

缺点:

「类数量增加,增加代码复杂度。」

「增加产品基类需要修改抽象工厂。」

乐于输出干货的Java技术公众号:狼王编程。公众号内有大量的技术文章、海量视频资源、精美脑图,不妨来关注一下!回复【资料】领取大量学习资源和免费书籍!

转发朋友圈是对我最大的支持!

 觉得有点东西就点一下“赞和在看”吧!感谢大家的支持了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值