设计模式之抽象工厂模式

简介: 设计模式之抽象工厂模式

1.抽象工厂模式简介


在之前的文章设计模式之工厂方法模,工厂方法模式可以将产品的创建过程放入具体的工厂类中,每一个工厂可以创建的一个具体产品,由此可能会创建很多个工厂类。


现实生活中,一个工厂可能不仅仅只生产一种产品,而是生产一类产品。比如一个体育用品厂,它可能会生产多种与体育相关的产品。此时,我们可以把这些相关的产品归为一个产品大类,由同一个工厂来生产,这便是抽象工厂模式


抽象工厂模式定义提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。


2.抽象工厂模式结构



抽象工厂模式与工厂方法模式从结构角度来说是相似的,不同之处在于,一个具体工厂可以生产出多个同种类型相关的产品。

抽象工厂:所有生产具体产品的工厂类的基类,提供工厂类的公共方法;

具体工厂:生产具体的产品;

抽象产品:所有具体产品的基类,提供具体产品类的公共方法;

具体产品:具体的产品类;

48.png


从上图可以看出,具体工厂ConcreteFactory_A可以生产两种产品ConcreteProduct_A_1和ConcreteProduct_A_2。客户端使用时,需要声明一个抽象工厂AbstractFactory和两个抽象产品AbstractProduct。


3.抽象工厂模式实战



假设有如下一个场景:体育运动爱好者CurryCoder想出门进行户外运动,他可以选择打篮球或者踢足球。但是,此时他还想打篮球或踢足球时同时穿上自己喜欢球员的球衣。篮球保管室可以提供篮球和篮球服,足球保管室也可以提供足球和足球服。CurryCoder只需要到对应的保管室申请对应的球和球衣就可以出门运动了。


47.png

#include <iostream>
using namespace std;
// 抽象产品类AbstractBall
class AbstractBall {
public:
    AbstractBall(){
    }
    // 公有方法:
    void play(){
    }
};
// 具体产品类
class Basketball: public AbstractBall{
public:
    Basketball(){
        play();
    }
    void play(){
        cout << "CurryCoder正在打篮球\n";
    }
};
class Football: public AbstractBall{
public:
    Football(){
        play();
    }
    void play(){
        cout << "CurryCoder正在踢足球\n";
    }
};
// 抽象产品类AbstractShirt
class AbstractShirt{
public:
    AbstractShirt(){
    }
    // 公有方法
    void wearShirt(){
    }
};
// 具体产品类
class BasketballShirt: public AbstractShirt{
public:
    BasketballShirt(){
        wearShirt();
    }
    void wearShirt(){
        cout << "CurryCoder穿上库里的篮球衣啦\n";
    }
};
class FootballShirt: public AbstractShirt{
public:
    FootballShirt(){
        wearShirt();
    }
    void wearShirt(){
        cout << "CurryCoder穿上C罗的足球衣啦\n";
    }
};
// 定义抽象工厂AbstractFactory
class AbstractFactory{
public:
    virtual AbstractBall* getBall() = 0;
    virtual AbstractShirt* getShirt() = 0;
};
// 定义具体工厂BasketballFactory
class BasketballFactory: public AbstractFactory{
public:
    BasketballFactory(){
        cout << "Basketball Factory\n";
    }
    AbstractBall* getBall(){
        cout << "CurryCoder得到篮球一个\n";
        return new Basketball();
    }
    AbstractShirt* getShirt(){
        cout << "CurryCoder得到篮球衣一件\n";
        return new BasketballShirt();
    }
};
// 定义具体工厂FootballFactory
class FootballFactory: public AbstractFactory{
public:
    FootballFactory(){
        cout << "Football Factory\n";
    }
    AbstractBall* getBall(){
        cout << "CurryCoder得到足球一个\n";
        return new Football();
    }
    AbstractShirt* getShirt(){
        cout << "CurryCoder得到足球衣一件\n";
        return new FootballShirt();
    }
};
// 客户端程序
int main(){
    // 定义工厂类对象
    AbstractFactory* fac = nullptr;
    // 定义产品类对象
    AbstractBall* ball = nullptr;
    AbstractShirt* shirt = nullptr;
    fac = new BasketballFactory();
    ball = fac->getBall();
    shirt = fac->getShirt();
    cout << "======================我是完美分隔线====================\n";
    fac = new FootballFactory();
    ball = fac->getBall();
    shirt = fac->getShirt();
    return 0;
}


46.png


4.抽象工厂模式总结


抽象工厂模式中,如果需要新增一个系列的产品(例如增加排球这个产品大类),只需增加一个新的产品大类(具体产品和抽象产品类)并提供一个对应的工厂类即可。但是,如果要在已有的产品大类中增加另一个新产品,比如CurryCoder打篮球,除了需要篮球和篮球衣外,还想换双篮球鞋,这时候该怎么办呢?是不是要去修改BasketballFactory呢?因此,本文总结了抽象工厂模式的特点


优点:


(1).抽象工厂模式用于创建客户所需的具体产品,同时向客户隐藏某个具体产品类将被实例化的细节,用户只需关心所需产品对应的工厂;

(2).加入新的产品大类时,无需修改原有系统,增强了系统的可扩展性,符合开闭原则。


缺点:


如果要在已有产品大类中添加新产品时,需要修改抽象层代码,对原有系统改动较大,违背开闭原则。

相关文章
|
25天前
|
设计模式
「全网最细 + 实战源码案例」设计模式——抽象工厂模式
抽象工厂模式是一种创建型设计模式,提供接口用于创建一系列相关或依赖的对象,无需指定具体类。它解决了产品族问题,管理和创建一组相关产品。结构上包括抽象工厂、具体工厂、抽象产品和具体产品。适用于创建相关对象、产品族固定但种类变化的场景。优点是分离接口与实现、管理产品族方便且扩展性好;缺点是产品族扩展困难且代码复杂度增加。通过配置文件和反射机制可进一步改进,使系统更灵活易扩展。
67 17
|
5月前
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
6月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
50 1
|
6月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
6月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
6月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式
|
8月前
|
设计模式 SQL 关系型数据库
抽象工厂模式-大话设计模式
抽象工厂模式-大话设计模式
|
8月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
43 5
|
8月前
|
设计模式 XML Java
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
三 结尾 如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持! 如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号
83 5
|
8月前
|
设计模式 架构师 NoSQL
设计模式-工厂方法模式和抽象工厂模式
 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
227 0

热门文章

最新文章