设计模式之抽象工厂模式

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

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).加入新的产品大类时,无需修改原有系统,增强了系统的可扩展性,符合开闭原则。


缺点:


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

相关文章
|
6月前
|
设计模式 Java 关系型数据库
【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)
一、入门 什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。 简单来说,抽象工厂模式是工厂方法模式的升级版,它能够创建一组相
214 14
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
87 0
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
185 5
|
10月前
|
设计模式
「全网最细 + 实战源码案例」设计模式——抽象工厂模式
抽象工厂模式是一种创建型设计模式,提供接口用于创建一系列相关或依赖的对象,无需指定具体类。它解决了产品族问题,管理和创建一组相关产品。结构上包括抽象工厂、具体工厂、抽象产品和具体产品。适用于创建相关对象、产品族固定但种类变化的场景。优点是分离接口与实现、管理产品族方便且扩展性好;缺点是产品族扩展困难且代码复杂度增加。通过配置文件和反射机制可进一步改进,使系统更灵活易扩展。
181 17
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
139 2
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
368 4
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
119 1

热门文章

最新文章