C++ 【抽象工厂】

突破编程_C++_设计模式(抽象工厂模式) c++ 设计模式:抽象工厂模式 阅读详情

基础理解

Q:抽象工厂与简单工厂有什么不同
A:抽象工厂适用于一个产品下面有许多具体的子产品,而简单工厂则是只有一个单一的产品。所以抽象工厂在使用中会多一些。

Q:抽象工厂的应用场景
A:首先你要懂得简单工厂的思路用法,如果你需要与多个不同系列(椅子,沙发)的相关产品(维多利亚,现代)交互, 但是由于无法提前获取具体产品类 (现代椅子 ), 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建,在这种情况下, 你可以使用抽象工厂。
跳转观看简单工厂

注意点

  1. 兼容性:确保由同一抽象工厂创建的所有产品都是兼容的,并且可以系统中无缝地进行交互和替换。
  2. 管理变体:确保每个变体都有对应的工厂,并且工厂创建的产品能够符合该变体的特性和要求。
  3. 足够抽象:遵循循依赖倒置原则,即高层模块不应该依赖于具体的实现细节,而应该依赖于抽象

在我下面写的代码中,ClientCode(客户端) 依赖于抽象类(抽象工厂AbstractFactory) 不具体依赖于是维多利亚工厂 或 现代工厂

创建抽象工厂

例如我们有:

  1. 椅子种类:维多利亚椅子 现代椅子…
  2. 沙发种类:维多利亚沙发 现代沙发…

拆分一下椅子种类
椅子抽象类拆分具体类
我们需要声明抽象工厂(AbstractFactory)——包含系列中所有产品构造方法的接口:Creat_Chair 和 Creat_Sofa
基于抽象工厂类创建 具体分支的工厂:维多利亚工厂 和 现代工厂 (维多利亚工厂只能创建维多利亚椅子,和维多利亚沙发)
有什么好用的画图软件推荐一下吗?我这个鬼软件复制vscode 的代码就变黑了

UML图

看个大体,明白之间的关系即可
空心箭头:继承关系
虚线箭头:依赖
实线箭头:关联
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
/**
产品家族的每个不同产品都应该有一个基础接口。产品的所有变体都必须实现这个接口。
 */

class Chair
{
public:
    virtual ~Chair(){};
    virtual std::string name() const = 0;
};

class VictorianChair : public Chair
{
public:
    std::string name() const override
    {
        return "维多利亚椅子\n";
    }
};

class ModernChair : public Chair
{
    std::string name() const override
    {
        return "现代椅子\n";
    }
};

/**
 这是另一个产品的基础接口。所有产品可以相互交互,但是只有相同具体变体的产品之间才可能进行适当的交互。
 */
class Sofa
{
public:
    virtual ~Sofa(){};
    virtual std::string name() const = 0;
    /**
     * ...但它也可以与Chair合作。
     * 抽象工厂确保其创建的所有产品都属于同一变体,因此是相容的。
     */
    virtual std::string combination(const Chair &collaborator) const = 0; // combination:组合
};

/**
 *维多利亚产品由相应的维多利亚工厂生产。
 */
class VictorianSofa : public Sofa
{
public:
    std::string name() const override
    {
        return "维多利亚沙发\n";
    }
    /**
    变体 维多利亚沙发只能与变体 维多利亚椅子 正确地配合使用。然而,它可以接受任何 椅子Chair 的实例作为参数。

   */
    std::string combination(const Chair &collaborator) const override
    {
        const std::string result = collaborator.name();
        return "给你送来 维多利亚沙发 和  " + result + " ";
    }
};

class ModernSofa : public Sofa
{
public:
    std::string name() const override
    {
        return "现代沙发\n";
    }

    std::string combination(const Chair &collaborator) const override
    {
        const std::string result = collaborator.name();
        return "给你送来 现代沙发 和 " + result + " ";
    }
};
/**
抽象工厂接口声明了一组方法,这些方法返回不同的抽象产品。这些产品被称为一个家族,它们之间由一个高层次的主题或概念相关联。一个产品家族可能有几个变体,但一个变体的产品与另一个变体的产品不兼容。
*/
class AbstractFactory
{
public:
    virtual Chair *Creat_Chair() const = 0;
    virtual Sofa *Creat_Sofa() const = 0;
};

/**
具体工厂生产属于单个变体的产品家族。工厂确保生成的产品是相容的。请注意,具体工厂方法的签名返回一个抽象产品,而在方法内部实例化一个具体产品。
*/
class VictorianFactory : public AbstractFactory
{
public:
    Chair *Creat_Chair() const override
    {
        return new VictorianChair();
    }
    Sofa *Creat_Sofa() const override
    {
        return new VictorianSofa();
    }
};

class ModernFactory : public AbstractFactory
{
public:
    Chair *Creat_Chair() const override
    {
        return new ModernChair();
    }
    Sofa *Creat_Sofa() const override
    {
        return new ModernSofa();
    }
};

/**
客户端代码只通过抽象类型 抽象工厂 和 抽象产品(椅子,沙发) 与工厂和产品进行交互。这样可以在不破坏客户端代码的情况下传递任何工厂或产品的子类。
 */

void ClientCode(const AbstractFactory &factory)
{
    const Chair *product_a = factory.Creat_Chair();
    const Sofa *product_b = factory.Creat_Sofa();
    std::cout << product_b->name() << "\n";
    std::cout << product_b->combination(*product_a) << "\n";
    delete product_a;
    delete product_b;
}

int main()
{
    std::cout << "Client: 测试维多利亚工厂:\n";
    VictorianFactory *f1 = new VictorianFactory();
    ClientCode(*f1);
    delete f1;
    std::cout << std::endl;
    std::cout << "Client: 测试现代工厂:\n";
    ModernFactory *f2 = new ModernFactory();
    ClientCode(*f2);
    delete f2;

    system("pause");
    return 0;
}

优缺点

优点缺点
确保同一工厂生成的产品相互匹配。采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。
避免客户端和具体产品代码的耦合。
单一职责原则。 同一种类的产品生成代码在到同一位置, 易于维护。
开闭原则。 引入新产品变体时, 无需修改客户端代码。

与其他模式的关系

  1. 抽象工厂可以用单例模式来实现。(只存在一个抽象工厂)
  2. 设计工作的初期都会使用 简单工厂 (较为简单, 而且可以更方便地通过子类进行定制), 随后演化为使用抽象工厂模式(更灵活但更加复杂)。
  3. 抽象工厂模式通常基于一组工厂方法, 但你也可以使用原型模式来生成这些类的方法。

原型工厂方法模式中,工厂方法不是直接创建产品的新实例,而是基于现有的原型(Prototype)对象创建新的产品实例。这种方式可以在需要创建新实例时避免耗费资源来实例化新对象,而是通过复制现有对象来创建新实例。

  1. 当只需对客户端代码隐藏子系统创建对象的方式时, 你可以使用抽象工厂来代替外观模式。(外观模式是隐藏整个代码)
  2. 你可以将抽象工厂和桥接模式搭配使用。 如果由桥接定义的抽象只能与特定接口API实现合作。(当这个抽象使用这个工厂,就会生产出符合这个抽象所需要的具体接口API)
    在这里插入图片描述
    如果有错还望指正。谢谢大家。
    参考文章
设计模式:抽象工厂模式C++实现 文章目录前言1. 抽象工厂模式理解2. C++实现抽象工厂模式总结 前言 今天复习了抽象工厂模式,之前复习了简单工厂模式和工厂方法模式,它们实现的功能都是一样的:为了封装对象的创建过程。如果大家对简单工厂模式和工厂方法模式不熟悉,可以看下之前的文章: 简单工厂模式:https://blog.youkuaiyun.com/DU_YULIN/article/details/119778822 工厂方法模式:https://blog.youkuaiyun.com/DU_YULIN/article/details/119821207 阅读详情

相关推荐

c++抽象工厂

1概念 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。 2产品族和产品等级结构 备注1:工厂模式:要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能同时生产一个产品组。抽象工厂:能同时生产一个产品族。===》抽象工厂存在原因 解释:具体工厂在开闭原则下, 能生产香蕉/苹果/梨子; (产品等级结构) 抽象工厂:在开闭原则下, 能生产:南方香蕉/苹果/梨子 (产品族) 北方香蕉/

希望我的博客,能帮上你解决学习中工作中所遇到的问题 621

C++的抽象工厂模式

抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 C++的抽象工厂模式有如下优势: 1)正如起名字,抽象工厂模式隔离具体类的生产,使客户不需要知道什么被创建。 2)当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。 3)增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。 而缺点是: 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。 下面直接给一个C++实例

fangfanglovezhou的博客 575

C++抽象工厂模式(Abstract Factory)

AbstractFactory.h: #ifndef ABSTRACT_FACTORY_H_ #define ABSTRACT_FACTORY_H_ ​ #include <memory> #include "AbstractProduct.h" ​ // 抽象工厂类 生产电影和书籍类等 class Factory { public: virtual std::shared_ptr<Movie> productMovie() = 0; virtual std::

我不是码农的博客~~~ 396

C++ 设计模式之抽象工厂模式

抽象⼯⼚模式可以确保⼀系列相关的产品被⼀起创建,这些产品能够相互配合使⽤,再举个例⼦,有⼀些家具,⽐如沙发、茶⼏、椅⼦,都具有古典⻛格的和现代⻛格的,抽象⼯⼚模式可以将⽣产现代⻛格的家具放在⼀个⼯⼚类中,将⽣产古典⻛格的家具放在另⼀个⼯⼚类中,这样每个⼯⼚类就可以⽣产⼀系列的家具。但是如果有多类产品呢,⽐如说“⼿机”,⼀个品牌的⼿机有⾼端机、中低端机之分,这些具体的产品都需要建⽴⼀个单独的⼯⼚类,但是它们都是相互关联的,都共同属于同⼀个品牌,这就可以使⽤到【抽象⼯⼚模式】。【声明】本编码题目来源于【

K1_uestc的博客 1309

c++抽象工厂示例

抽象工厂核心:分别定义抽象的工厂和抽象的产品。

我不是码农的博客~~~ 100

C++实现抽象工厂模式

抽象工厂模式的核心思想是定义一个抽象工厂接口,该接口声明了一组用于创建不同类型产品的方法。然后,针对每个具体的产品族,实现一个具体的工厂类,该工厂类负责创建该产品族中的具体产品。最后,通过使用抽象工厂接口来创建产品对象,从而实现产品的创建与使用的解耦。通过定义抽象工厂接口和具体工厂类,我们可以方便地创建不同类型的产品对象,而无需关心其具体的实现细节。下面是一个示例,展示了如何使用抽象工厂模式创建不同类型的手机和电视产品。,它们分别实现了抽象工厂接口中的方法,并负责创建相应的产品对象。

ByteScript的博客 149

C++:浅谈工厂模式与抽象工厂模式

C++:浅谈工厂模式与抽象工厂模式标签: C++ 工厂模式 抽象工厂模式by 小威威之前写过一篇谈模式的文章:单例模式接下来我将浅显的谈谈工厂模式与抽象工厂模式。工厂模式与抽象工厂模式虽有差异,但实现的目的可以看成一致的:They offers the interface for creating a family of related objects, without explicitly spe

linwh8的博客 5739

抽象工厂C++实现

抽象工厂应用场景表现为多个工厂有多个生产线(操作类),生产线又有多种。表现为多对多的情况。一个工厂有多个生产线,工厂又有多个,每家工厂的生产线又有共性。      但是具体的每个工厂,会绑定其对应的生产线,为一一对应关系。 结构图: 抽象工厂:   #pragma once #include "IOperator.h" #include "IOtherOperator.h

mz5111089的专栏 309

用C++实现(抽象工厂实例)

设计模式之---(抽象)工厂模式用C++实现(抽象工厂实例)前言一、什么是抽象工厂模式?二、为什么需要抽象工厂模式三、C++代码示意图1.调用者---sys_init函数2.抽象工厂class_hardware代码2.lcd具体工厂代码运行结果 用C++实现(抽象工厂实例) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录用C++实现(抽象工厂实例)前言一、什么是抽象工厂模式?二、为什么需要抽象工厂模式三、C++代码示意图1.调用者---sys_init函数2.抽象工厂class

qq_32832941的博客 659

C++ 抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。

青春不老,奋斗不止! 1万+

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】详细安装过程+小问题解决

由于Qt5无法与最新的vs2022兼容,扩展工具中一直显示不可用,所以将vs降级成vs2017。在安装Qt的过程中,会选择安装Qt套件,其中就的MCVS 2017,说明vs2017是与qt兼容的。当然也可以用qt creator这一原生IDE。OpenCV版本目前是最新的4.8.0,使用过程中没有什么问题,但是还是安装低版本大概率避免一些玄学问题。

qq_45306739的博客 3350

C++ 抽象工厂模式的实现

C++ 抽象工厂模式的实现

weixin_44178960的博客 598

解锁医疗AI密码:医疗人工智能专业大学四年学习路径

医疗AI人才培养路径解析 本文系统梳理了医疗人工智能专业四年培养方案,分为基础、进阶、应用和拓展四个阶段: 大一聚焦基础学科,涵盖高等数学、医学概论、Python编程等核心课程,辅以医学数据认知实习。大二深入机器学习和医学数据处理领域,学习监督/无监督学习算法及医学影像分析技术。大三进入深度学习阶段,掌握CNN/RNN等神经网络模型,并实践医疗AI应用开发。大四关注前沿技术如大模型在医疗中的应用,完成毕业设计与企业实习。 课程体系强调医工交叉,每学期均配置实践环节,从基础编程到参与真实医疗AI项目,逐步培养

AllenLV的博客 2501

工厂模式:抽象工厂模式 C++代码实现、场景及优缺点

抽象工厂模式是一种创建型模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而无需指定它们的具体类。在这个流程图中,Client类通过接口创建和对象。接口定义了创建产品的方法,而具体的工厂类实现了这些方法。每个具体的工厂类可以创建一系列相关的产品,比如和,或者和。这个流程图展示了抽象工厂模式的基本结构,通过抽象工厂和抽象产品的定义,可以方便地扩展新的产品系列,并且客户端代码可以方便地切换不同的产品系列。

十年以上编程经验的干货分享 1833

细说STM32单片机SPI-Flash芯片的FatFS移植及其应用实例详解

本文以开发板上的SPI-Flash芯片W25Q16为媒介详细介绍CubeMX中FatFS各个参数的意义和设置,分析生成的代码中FatFS各个文件的作用和关联,完成针对W25Q16的硬件访问层的移植。继续使用旺宝红龙开发板STM32F407ZGT6 KITV1.0。

wenchm的博客 1640

手把手教你用ZEMAX复现贝塞尔光束:从Thorlabs锥透镜到Edmund透镜的完整光路搭建

本文详细介绍了如何在ZEMAX光学设计软件中复现贝塞尔光束,从Thorlabs锥透镜到Edmund透镜的完整光路搭建过程。通过逐步指导,帮助研究人员和工程师掌握光学设计技巧,实现无衍射特性的贝塞尔光束生成,适用于激光加工和生物成像等领域。

weixin_33737774的博客 181

设计模式C++抽象工厂

分类:(对象)创建型 问题:家具城里有沙发,椅子,茶几等产品.产品有不同风格,如现代,北欧风,工业.希望客户收到的出产品风格统一,并可以方便的添加新产品和新风格.(这里不同风格相当于苹果手机搭配安卓充电线,我们想要苹果手机搭配苹果充电线这种统一风格的来使用) 解决方案:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们确定的类.

thank86的博客 1572

FreeRtos——10、全局看门狗设计

RTOS 里的看门狗不只是为了证明 CPU 还在动,而是为了证明每个业务逻辑都在按预期的节奏“呼吸”。

qq_40170041的博客 900

C++设计模式——抽象工厂模式

抽象工厂模式的核心目标是提供一个接口,允许客户端通过此接口创建一系列相关或相互依赖的对象,而不必知道具体产生的对象的具体类

qqrrjj2011的博客 1948

JavaSwing_4.2: JDialog、JOptionPane(对话框)

JDialog,对话框。使用 JDialog 类可以创建自定义有的对话框,或者调用 JOptionPane 中的多个静态方法快速创建各种标准的对话框。JOptionPane是 JavaSwing 内部已实现好的,以静态方法的形式提供调用,能够快速方便的弹出要求用户提供值或向其发出通知的标准对话框。

谢TS的博客 7万+

uniapp - 实现集成调用zebra斑马打印机+打印标签+打印二维码详细实例代码,通过蓝牙连接打印机打印与通过打印机IP和端口两种方式适配斑马打印机(全平台兼容H5、微信小程序、苹果安卓App)

uniapp适配斑马打印机 实现标签打印,uniapp适配斑马打印机实现标签打印,uniapp调用zebra斑马打印机打印标签,uniApp连接传统蓝牙的斑马打印机打印,实现标签打印功能uniapp 蓝牙连接斑马打印机发送zpl指令打印,适配斑马(Zebra)牌打印机,小程序调用蓝牙打印机完整代码,uniapp 打印机wifi链接 蓝牙链接,uniapp斑马打印机,实现二维码标签展示以及打印,APP端连接打印机打印小票和标签,uniapp使用斑马打印中文不出来,打印机连接不上,打印没反应怎么办,打印报错,斑

🏆 前端领域优质创作者 1万+

C++ 设计模式-抽象工厂

C++ 抽象工厂

ox0080的博客 750

辉芒微教程第七篇《PWM与PWM3调节LED灯的亮度》

这个其实就是PR3L = 128设置的,由于我们刚刚寄存器设置了8位模式,其设置的范围就是0-255,而128/255≈50%左右,因此PR3L就是我们的占空比调节的寄存器,我们可以通过它来调节占空比,大家可以试试它占空比设置10%,30%,60%来看看它的不同效果,灯的亮度是肯定不一样的,如果有条件的朋友,可以购买一款逻辑分析仪去看他的占空比。平平无期的这个东西有什么东东用,貌似是没什么用,只是一个概念而已,是不是不同设备可以设置1秒,3秒,10秒的周期就行?但是它占空比为什么是50%,怎么得来的?

qq_41809823的博客 827

【C++】Chapter11:抽象工厂模式

先说下之前用到过的【工厂方法模式】是定义一个用于创建对象的接口。让子类决定实例化哪一个类。在说【抽象工厂模式(Abstract Factory)】,提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式的优点和缺点:最大的好处便是易于交换产品系列,由于具体工厂类,例如 IFactory factory = new ConcreteFactory(), 在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。

没什么好介绍的 1287

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++中的抽象工厂模式

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

GOLOJO的博客 962

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

抽象工厂方法C++实现

看了设计模式中的抽象工厂方法,书中用到了C#中的反射技术,而C++中没有反射,我就参考MFC中为实现动态创建而设计的DYNCREATE MACRO的方法来克服抽象工厂的不足。使工厂类完全不更改的情况下就能随意添加新的产品类。工厂类通过读取配置文件动态创建对象。 Utility.h class COperator; typedef COperator* (*pCreateFun)(); s

yqyy1989的专栏 630

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: c++【简单工厂】
下一篇: C++ 【桥接模式】
Absorbed__
博客等级 码龄5年 182粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值