【Design Pattern】简单工厂模式

c++简单工厂模式、工厂方法模式与抽象工厂模式的实现和优缺点 简单工厂模式工厂方法模式抽象工厂模式 阅读详情

1、为什么要使用工厂模式?

首先先看看不使用工厂模式的代码


class MyAPI
{
public:
    virtual void MyFunc();
};

class A : public MyAPI
{
    void MyFunc()
    {
        printf("A");
    }
};

class B : public MyAPI
{
    void MyFunc()
    {
        printf("B");
    }
};


void ClientFunc()
{
    MyAPI * a = new A;
    MyAPI * b = new B;
    a->MyFunc();
    b->MyFunc();
}


在面向对象程序设计里面,非常讲究层的划分和模块的划分。通常按照三层来划分程序,分别是表现层、逻辑层和数据层,它们之间都要通过接口来通信。在每一个层里面,又有 很多个小模块,每个小模块对外则是一个整体,所以一个模块对外应该提供接口,其他地方需要使用到这个模块的功能时,可以通过此接口来进行调用。 这也就是常说的“接口是 被其隔离部分的外观”。


有何问题?请各位仔细看客户端这段话:

MyAPI * a = new A;
MyAPI * b = new B;

然后再想想接口的功能和思想,发现什么了?仔细再想想?你会发现在客户端调用的时候,客户端不但知道了接口,同时还知道了具体的实现就是A。 接口的思想是“封装 隔离”,而实现类A/B应该是被接口MyApi封装并同客户端隔离开的,也就是说,客户端根本就不应该知道具体的实现类是A/B。有朋友说,那好,我就把A/B从客户端拿掉,让Api真正地对 实现进行“封装 隔离”。可是,新的问题出现了,当他把“ new A()”去掉后,却发现无法得到MyApi接口对象了,怎么办呢?把这个问题描述一下:在面向对象编程中,出现只知接口而不知实现,该怎么办? 就像现在的Client,它知道要使用Api接口,但是不知由谁实现,也不知道如何实现,从而得不到接口对象,就无法使用接口,该怎么办呢?


2、解决方案--是工厂模式:

请看以下代码:

class MyAPI
{
public:
    virtual void MyFunc();
};

class A : public MyAPI
{
    void MyFunc()
    {
        printf("A");
    }
};

class B : public MyAPI
{
    void MyFunc()
    {
        printf("B");
    }
};

class Factory
{
public:
    static MyAPI* createInstance(int type)
    {
        if(0 == type)
        {
            return new A;
        }
        else if (1 == type)
        {
            return new B;
        }
        else
        {
            return NULL;
        }
    }
};

void ClientFunc()
{
    MyAPI* a = Factory::createInstance(0);
    MyAPI* b = Factory::createInstance(1);
    a->MyFunc();
    b->MyFunc();
}

就如同上面的示例 ,客户端通过简单工厂创建了一个实现接口的对象 ,然后面向接口编程 ,从客户端来看 ,它根本不知道具体的实现是什么 ,也不知道是如何实现的 ,它只知道通过工厂获得了一个接口对象 ,然后通过这个接口来获取想要的功能 。事实上 ,简单工厂能帮助我们真正地开始面向接口编程 ,像以前的做法 ,其实只是用到了接口的多态部分的功能 ,而最重要的 “封装隔离性 ”并没有体现出来。


3、常见问题:

首先来解决一个常见的问题 :可能有朋友会认为 ,上面示例中的简单工厂看起来不就是把客户端里面的 “new A / new B”移动到简单工厂里面吗 ?不还是一样通过new一个实现类来得到接口吗?把 “new A / new B”这句话放到客户端和放到简单工厂里面有什么不同吗 ?提示理解这个问题的重点就在于理解简单工厂所处的位置 。根据前面的学习 ,我们知道接口是用来封装隔离具体的实现的 ,目标就是不要让客户端知道封装体内部的具体实现 。简单工厂的位置是位于封装体内的 ,也就是简单工厂是跟接口和具体的实现在一起的 ,算是封装体内部的一个类 ,所以简单工厂知道具体的实现类是没有关系的 。


4、工厂模式的优缺点

简单工厂有以下优点 :

■帮助封装简单工厂虽然很简单 ,但是非常友好地帮助我们实现了组件的封装 ,然后让组件外部能真正面向接口编程 。

■解耦通过简单工厂 ,实现了客户端和具体实现类的解耦 。如同上面的例子 ,客户端根本就不知道具体是由谁来实现 ,也不知道具体是如何实现的 ,客户端只是通过工厂获取它需要的接口对象 。


简单工厂有以下缺点 :

■可能增加客户端的复杂度如果通过客户端的参数来选择具体的实现类 ,那么就必须让客户端能理解各个参数所代表的具体功能和含义,各个参数所代表的具体功能和含义 ,这样会增加客户端使用的难度 ,也部分暴露了内部实现 ,这种情况可以选用可配置的方式来实现 。 

■不方便扩展子工厂私有化简单工厂的构造方法 ,使用静态方法来创建接口 ,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了 。不过 ,通常情况下是不需要为简单工厂创建子类的 。





陈臣 (2011-01-01). 研磨设计模式 (Kindle Locations 856-860). 清华大学出版社. Kindle Edition. 



SAP打印错位问题终极解决指南:LP01设备格式设置全流程 本文详细解析了SAP系统中LP01设备打印错位问题的解决方案,重点介绍了SPAD事务码的配置流程和格式设置技巧。通过精准调整输出设备、设备类型和格式类型的匹配关系,有效解决'未定义格式'错误,确保打印内容准确对齐。文章还提供了高级排查方法和预防措施,帮助SAP管理员提升打印管理效率。 阅读详情

相关推荐

【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程

这章来学习串口数据流操作。仿照成品制作一个自己用Qt编写的串口助手。 1. 布局UI界面 创建QWidget工程,布局UI界面:拖入2个 Plain Text Edit,作为串口数据的接收显示和发送框。 拖入几个 Combo Box 、Label 和 Push Button,使用两个Widget进行布局。如下所示。 将接收区的 Plain Text Edit,属性勾选上 readOnly,使其运行时不会被人为的输入操作影响。 加入一些弹簧,使布局美观。(有必要可以加设置不能调整..

Mark_md的博客 9272

C/Cpp / 设计模式 / 简单工厂模式

--------------------------------------------- -- 时间:2019-03-19 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163.com --------------------------------------------- 一、实质 本质是工厂实例创建并输出产品类实例的过程。 二、栗子 1、产品...

布袋和尚 277

模拟IC版图DRC实战:手把手教你搞定MIM电容天线错误和ESD.10g违例

本文深入解析模拟IC版图中的MIM电容天线错误和ESD.10g违例问题,提供从错误解码到实战修复的完整指南。通过电路图修改、版图优化和验证闭环等步骤,帮助工程师高效解决DRC错误,特别适用于ADC等精密模拟电路设计。文章还分享了高级排错技巧和预防性设计策略,大幅提升流片成功率。

weixin_27697385的博客 293

C++设计模式之简单工厂模式

简介 简单工厂模式是设计模式中之一的典例,是一种可以达到完全解耦性的编程思想 工厂模式典例 比如设计一个播放器类,这个类可以解析A视频网站的资源,也可以进行解析B网站的资源,如果想达到类的设计程度,必须按照多态的思想进行编程,多态的其意思可以大概理解成相同的类具有不同的功能。 设计方式可以给定一个带有纯虚函数的类,比如这个虚函数有播放,暂停,切换上一个视频,切换下一个视频、这几个常用的功能是这个类方法的组合基本上是不变的,如播放-->暂停-->切换下一个视频这组合基本上不变,变的是这

u012588599的博客 1140

探索Vortex开源GPGPU:RISC-V SIMT架构(2),指令Decode

本文分析了Vortex RISC-V内核的Decode模块设计。文章详细介绍了指令译码过程,包括操作码、功能码和寄存器字段的提取,以及不同类型指令(R/I/S/B/U/UJ)的立即数处理。重点阐述了基于操作码和功能码的分层译码逻辑,包括ALU运算、分支跳转、系统调用等指令的译码规则。此外,还描述了定制指令的处理机制以及与调度器的握手协议。Decode模块通过组合逻辑实现快速译码,并将结果传递给下级Issue模块,同时协调指令流控制。

weixin_55313207的博客 1792

电拖笔记1电磁学基本知识与定律

电拖学习

qq458629839的博客 1131

盘点适合入门学习的C/C++开源项目

C 项目名称: C 项目简介: 是的,你没有看错,这个项目的名字就是单个字母C。C是一个宝藏项目,可以说是学习数据结构和刷算法题的利器,因为里面包含了几乎各种基础算法、数据结构、以及LeetCode算法题的C语言实现。具体包括: 客户端/服务器问题 统计方法问题 进制转换问题 各种数据结构:数组、链表、字典、二叉树、堆、栈、队列、哈希、图等等 搜索/查找问题 排序问题 LeetCode习题 其他杂项问题 注意,下图中只是截取了一部分数据结构和算法题的具体实现: 对于我们的作用: 可以帮助我们更好的学习数据

OceanStar的博客 3万+

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 303

简单工厂模式(C++实现)

(本博客旨在个人总结回顾) 目录 1、详情: 2、应用: 3、UML类图: 4、代码实现: 1、详情: 简单工厂模式(静态工厂方法模式)并不属于Gof中的23设计模式之一。 简单工厂模式包含三个角色: ①工厂类角色:这是本模式的核心,含有一定的判断逻辑,根据逻辑不同产生具体的工厂产品。例子中的:MyAlgorithmFactory ②抽象产品类角色:一般为具体产品继承的父类或者...

qq_23903863的博客 3055

青岛鼎信Java开发面试题及参考答案(3万字长文,多张原理图)

MySQL 的事务特性有哪些? MySQL 事务具有四个重要特性,被称为 ACID 特性。 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。例如,在银行转账场景中,从账户 A 转账到账户 B,包括扣减账户 A 的金额和增加账户 B 的金额这两个操作必须作为一个整体来完成。如果在执行过程中发生错误,比如系统崩溃或者数据库出现故障,那么已经执行的部分必须全部回滚,就好像整个转账操作从未发生过一样。 一致性(Consistency):事务必须

大模型大数据攻城狮的专栏 1085

openbmc mctp i3c适配步骤

本文介绍了在Intel OKS平台下,BMC作为I3C从设备如何适配MCTP over I3C的实现方法。主要内容包括:1)关键术语解释,如MDB(Mandatory Data Byte)值为0xAE,DCR(Device Characteristics Register)和BCR(Bus Characteristics Register)的设置;2)适配流程说明,包括BMC作为控制器主节点分配地址后成为MCTP端点,CPU作为总线所有者的角色转换;3)测试验证步骤,展示通过mctp-client工具发送指

wit_yuan的专栏 131

设计模式(Design Pattern)之简单工厂模式(Simple Factory Pattern)

简单工厂模式确实有足够的简单,将父类的引用指向子类的对象,并将子类的创建过程交给工厂类来完成。 在该结构图中,加减乘除四种运算都继承自运算类,当程序要使用一种运算类的时候,无论是加减乘除,可以通过如下代码使用: Operation oper = Factory.createOperate("+"); 尽管简单工厂将对象的创建过程进行了封装,使用者...

weixin_34199335的博客 125

【异常】Claude Code CLI工具 模型加载异常 /init报错排查与完整解决方案 There‘s an issue with the selected model (glm-5). It

此类跨厂商模型配置报错,核心诱因是API生态的兼容性不匹配。优先使用工具原生支持的模型体系,可快速解决90%以上的同类报错;若需跨厂商使用目标模型,需完成API端点、鉴权密钥、模型ID的全链路适配,确保全流程配置合规,即可完成异常修复。

奶爸的编程之路,也就一周冷个三天 3699

Design Pattern (Factory Method)[Simple Factory Pattern]

前言: 每个事物,每个方法,没有是完美的,当一种目前的方法解决不了目前的问题的时候,一种模式的多种形态就产生了,在产生的同时,暴露出了以前解决方法的不足之处同时也体现出了新的解决方法的优势!所以说这完全体现了事物的完美性取决相对的环境与条件之下,他们没有好坏之分,没有优缺点之分,这些方法只是在对待相同本质的问题,但是比较复杂的情况下不适应复杂因素的改变摆了! 工厂模式的...

TJYCHYANGCHENHUI的专栏 185

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 简单工厂模式(Simple Factory Pattern) - Java实现

简单工厂模式(Simpale Factory Pattern):定义了一个工厂类,可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。 因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式。

Z 833

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

[design pattern](4) SImple Factory

前言 本博客主要介绍简单工厂模式(Simple Factory),简单工厂模式是创建型模式的一员,也是我们平时coding用到的比较多的一个模式了。 思考题 首先,让我们思考以下的需求: 博主,突然很想吃宫保鸡丁和西红柿炒鸡蛋,那么博主的需求怎样才能得到满足呢? 当我们没有修炼过简单工厂模式这本秘籍,我会自己动手做: 首先我会上百度搜索到制作那两个菜的方法:...

weixin_30301183的博客 133

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Design Pattern :Simple Factory

一、简单工厂模式: Simple Factory 不是23个经典的设计模式中的一员,但这是基础 Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。 二、它的模式角色与结构 工厂角色类Creator:工厂类在客户端的直接控制下(Creator方法)创建产品 抽象产品角色Product:定义简单工厂创建的对象

奋斗、 747

Design Pattern【2.1】Simple Factory

定义: 专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。 意图: 提供一个类,由它负责根据一定的条件创建某一具体类的实例 优点: 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,...

weixin_30376163的博客 78

Design Pattern: Simple Factory 模式

学习是分享和合作式的! 转载请注明出处:http://blog.youkuaiyun.com/wdzxl198/article/details/9219385; 文章摘自: http://www.riabook.cn/doc/designpattern/;         Simple Factory模式(又称Static Factory模式),一个Simple Factory生产成品,而对客户端隐

Atlas2013的专栏 1182

Design Pattern之简单工厂模式

简单工厂模式顾名思义,就是专门负责生产的,我们需要什么,就让其生产什么。该模式在开发过程中经常会用到,其好处就是在于设计的类能够达到可维护、可复用、可扩展、灵活性好的目的。 例如,利用C++设计一个加减乘除的小程序,直观的思维直接通过输入判断符号类型(+、-、*、/),然后根据不同的类型,直接算出结果,这样有一个问题,如果以后要修改的时候,需要在同一个文件里找到需要增加判断的地方,容易出错。因此...

delongwang520的博客 256

Simple Factory(Static Factory) Design Pattern

<br />  Simple Factory设计模式,隐藏实现细节,客户只需知道怎么用就OK,不用知道实现细节。<br />  Demo:<br />    有发钢琴音的音乐盒,发小提琴音的音乐盒。<br />    音乐盒:<br />       public interface IMusicBox {<br />          String play();<br />        }<br />    钢琴音的音乐盒:<br />       public class PianoBox im

sean的专栏 281

简单工厂设计模式(Simple Factory Design Pattern)

【引言】最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题。另外一点比较有见解的是,区分了设计模式(Design Pattern),结构模式(Architecture Pattern),架构类型(Architecture Style). 如下图所示 De...

weixin_30508241的博客 80

AS3 Design Pattern: Simple Factory 模式

AS3 Design Pattern: Simple Factory 模式 2009年07月22日   Simple Factory模式(又称Static Factory模式),一个Simple Factory生产成品,而对客户端隐藏产品产生的细节。实作时定义一个产品介面(interface),并透过特定静态方法来建立成品。   假设有一个音乐盒工厂,购买音乐盒的客人不用知道音乐盒是如...

dq630dq 127

design pattern - 简单工厂模式

开闭原则:OCP,open-closed principle 对修改关闭,对扩展开放。 设计模式是为了,降低耦合和提高程序的可维护性和可扩展性。 CHANGE带给我们的噩梦 面向基类编程。 1、简单工厂模式 简单工厂模式中,工厂负责生产的产品的抽象基类,也可以是接口 [code="java"] /** * abstract base class ...

pingxumeng的专栏 151
上一篇: 【Design Pattern】C++ 线程安全的单例模式
下一篇: 【Design Pattern】外观模式 Facade
null_pointer_fatal
博客等级 码龄11年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值