[设计模式]抽象工厂模式(AbstructFactory)

国家大地2000坐标系投影坐标转高德地图经纬度坐标-【高斯投影坐标】 国家大地2000坐标系投影坐标转换成高德经纬度坐标显示画图。 阅读详情

1.意图

       定义了一个创建一系列相关或相互依赖的接口,而无需指定它们的具体类。

2.结构与参与者


3.效果

1) 分离了具体的类(优)

       因为工厂封装了创建产品对象的责任和过程(只是用一个return语句返回具体对象),这将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分析;它们不出现在客户代码中。

2)易于交换产品系列(优)

        一个具体工厂类在应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置(SQLServer—Oracal、用户界面中不同的窗口组件)。

3)有利于产品的一致性(优)

        当yield系列中的产品对象呗设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而抽象工厂模型很容易做到这一点。

 4)难以支持新种类的产品(缺)

        这是因为AbstractFactory接口确定了可以被创建的产品集合。支持新种类的产品就需要扩展该工厂的接口(好比数据库实现了用户和部门功能,现在要加入薪水功能),这将涉及AbstractFactory类及其所有子类的改变。

4.实现

       实现AbstractFactory模式的一些有用技术:

1) 将工厂(具体)作为单件——一个应用中一般每个产品系列只需一个ConcreteFactory的实例。因此工厂通常最好实现为一个Singleton。

2) 创建产品——AbstractFactory仅声明一个创建产品的接口,真正创建产品是由ConcretFactory子类实现的。通常的一个办法视为每一个产品定义一个Factory Method。

3) 定义可扩展的工厂——对于AbstractFactory难以支持新种类的缺点。一个更灵活但不太安全的设计是给产假对象的操作增加一个参数,该参数指定需要被创建的类型系列。这就好比用简单工厂去修改抽象工厂(在接口内部运用swith语句)。

5.代码示例

#include <string>
#include <iostream>
#include <vector>
using namespace std;

//用户抽象接口
class IUser
{
public :
	virtual void GetUser()=0;
	virtual void InsertUser()=0;
};

//部门抽象接口
class IDepartment
{
public:
	virtual void GetDepartment()=0;
	virtual void InsertDepartment()=0;
};

//ACCESS用户
class CAccessUser : public IUser
{
public:
	virtual void GetUser()
	{
		cout<<"Access GetUser"<<endl;
	}
	virtual void InsertUser()
	{
		cout<<"Access InsertUser"<<endl;
	}
};

//ACCESS部门
class CAccessDepartment : public IDepartment
{
public:
	virtual void GetDepartment()
	{
		cout<<"Access GetDepartment"<<endl;
	}
	virtual void InsertDepartment()
	{
		cout<<"Access InsertDepartment"<<endl;
	}
};

//SQL用户
class CSqlUser : public IUser
{
public:
	virtual void GetUser()
	{
		cout<<"Sql User"<<endl;
	}
	virtual void InsertUser()
	{
		cout<<"Sql User"<<endl;
	}
};

//SQL部门类
class CSqlDepartment: public IDepartment
{
public:
	virtual void GetDepartment()
	{
		cout<<"sql getDepartment"<<endl;
	}
	virtual void InsertDepartment()
	{
		cout<<"sql insertdepartment"<<endl;
	}
};

//抽象工厂
class IFactory
{
public:
	virtual IUser* CreateUser()=0;
	virtual IDepartment* CreateDepartment()=0;
};

//ACCESS工厂
class AccessFactory : public IFactory
{
public:
	virtual IUser* CreateUser()
	{
		return new  CAccessUser();
	}
	virtual IDepartment* CreateDepartment()
	{
		return new CAccessDepartment();
	}
};

//SQL工厂
class SqlFactory : public IFactory
{
public:
	virtual IUser* CreateUser()
	{
		return new  CSqlUser();
	}

	virtual IDepartment* CreateDepartment()
	{
		return new CSqlDepartment();
	}
};

//客户端:
int main()
{
	IFactory* factory= new SqlFactory();
	IUser* user=factory->CreateUser();
	IDepartment* depart = factory->CreateDepartment();
	user->GetUser();
	depart->GetDepartment();
	return 0;
}



8 卡 GPU 服务器与 NVLink/NVSwitch 互联技术 NVLink 是一种点对点的高速互连技术,单条 NVLink 就是一条全双工双路信道,每条 NVLink 链路可以将 2 个 GPU 直连起来,并且每个 GPU 可以提供多条 NVLink 接口连接多个 GPU。另外,PCIe Switch 互联拓扑中的 GPU 之间可能存在 GPU0→Switch0→CPU0→CPU1→Switch1→GPU7 的通信链路,它的通信不可避免的存在一定的延迟,因而更适合用于对信号效率不敏感且追求性价比的使用场景,如:推理、云计算等领域。本文讨论的是单机 GPU 卡间互联。 阅读详情

相关推荐

告别软件轮询!用STM32G474的COMP比较器实现纳秒级硬件过压保护(CubeMX配置详解)

本文详细介绍了如何利用STM32G474的COMP比较器实现纳秒级硬件过压保护,通过CubeMX配置详解,展示了硬件比较器相比传统软件轮询方案在响应时间、CPU占用和可靠性等方面的显著优势。文章还提供了实战配置流程和优化技巧,帮助工程师快速构建高效的硬件保护系统。

weixin_28683689的博客 351

23种设计模式分析(3):结构型模式

1.1.6 Adapter适配器模式   GOF《设计模式》一书对Adapter模式是这样描述的:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。这段话大致是说:我们需要一种方式,为一个功能正确但接口不合的对象创建...

chuifuhuo6864的博客 310

4.图像sensor的特性和驱动解析

例子:sensor驱动自己提供操作曝光时间的函数和获取曝光时间的函数,然后将这个函数注册到ISP库和3A算法库,3A算法库根据外部光照强度计算出一个Sensor曝光时间的设置值,ISP库得到这个设置值,然后通过Sensor之前注册的回调函数,把这个值设置到Sensor的硬件寄存器中去,实现整个过程。是为 ISP 配置正确的输入时序。(1)修改驱动源码(sambashar\Hi3518E_SDK_V1.0.3.0\package\mpp\component\isp\sensor\ar0130)

weixin_53762042的博客 3566

设计模式之抽象工厂模式(AbstructFactory)

抽象工厂模式(AbstructFactory) 优点: 1.可以支持不同类型的产品,使得产品的灵活性更强 2.可以很方便的一族中间的不同类型的产品 缺点: 结构过于臃肿,如果产品类型过大,就会难以管理 代码实现: AbstructFactory.h #ifndef ABSTRUCTFACTORY_H #define ABSTRUCTFACTORY_H /*ProductA

zrf的专栏 671

eNSP网络构建—建立小型局域网

企业私有网络构建运维 实战案例——使用模拟器构建局域网络 案例分析 1.架构分析 (1)需求分析 本实验的目的在于建立小型局域网。由于公司由不同部门组成,并分布在不同地点,因此需要划分不同网络实现互联互通。设计以下网络:两个部门各使用一台交换机连接,然后连接到总交换机,再通过路由器与外网以及其他部门网络相连。为了控制网络上的广播风暴,增加网络的安全性,在交换机上需要设置VLAN,在路由器与交换机之...

_ 4万+

OPC DCOM详细配置方法 - 不关防火墙不换登陆用户

1. 前言   OPC DCOM的设置是实现跨网络OPC通信的基础,现有的一些OPC DCOM配置教程虽然讲解了如何配置DCOM,但没有讲清楚为什么要这么做,而且各个教程涉及的配置方法也不尽相同。   为了彻底搞清楚OPC DCOM的配置过程,我重新做了两台机器的系统,一台是Windows 7 32位,一台是Windows 10 64位,并且重零开始完整的测试了正常运行OPC DCOM所需的最少的...

steventian72的博客 3万+

设计模式----AbstructFactory模式(简单C++实现)

Abstruct Pattern AbstructProduct.h #ifndef _ABSTRUCTPRODUCT_H_ #define _ABSTRUCTPRODUCT_H_ class abstructproductA { public: virtual ~abstructproductA(); protected: abstructproductA(); private: }; class abstructproductB { public: virtual ~a

mazamu的博客 263

ubuntu22.04 安装部署 openclaw

ubuntu22.04 安装部署 openclaw

nalanxiaoxiao2011的博客 973

C#演示抽象工厂模式

抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。

让每一个想学习编程的人,都能学会,都能看懂,看了都有收获! 440

记一次完整的RPG Maker MV游戏逆向过程(思路一)

了解RPG Maker MV的文件建构 上一篇文章,我们已经成功在PC上运行了游戏,那我们如何对游戏进行逆向呢? 首先要了解正常的RPG Maker MV制作的游戏应该具有哪些文件,以及他的结构 那如何了解他的结构呢,很简单,我们只需要用RPG Maker MV创建一个默认工程,来看看一个游戏的最简结构是怎么样的 创建新项目 项目创建完成 查看项目目录结构 是不是和之前解包出来的很像呢? 通...

Ciiiiiing的博客 1万+

Android 9.0 延时开机动画解决首次开机黑屏和去掉android正在启动的提示框

在9.0的系统产品rom定制化开发中,在一些产品中会出现在首次开机的时候,由于在开机动画播放完以后会出现几秒短暂的黑屏情况,然后进入默认Launcher,这在产品体验上 也是感觉到有点差,所以会要求在去掉这个首次开机黑屏的效果,和在启动过程中的 android is starting这个提示框的这些效果优化,接下来就分析下相关功能, 然后实现这个功能的开发

安卓兼职framework和app工程师的博客 3244

学习笔记:关注C++设计模式之AbstractFactory模式

#ifndef ABSTRACTFACTORY_H #define ABSTRACTFACTORY_H class AbstractProductA; class AbstractProductB; class AbstractFactory { public: vi

NEVER 742

1、动作捕捉技术:概述与历史

本博文全面介绍了动作捕捉技术的概念、历史演变、类型分类以及完整的工作流程。从早期的连续摄影技术到现代数字动作捕捉系统,文章深入探讨了光学、磁性和机械动作捕捉系统的优缺点及适用场景,并详细解析了动作捕捉数据的生成原理与数学基础。此外,还涵盖了特殊部位如手部、面部和木偶的动作捕捉方法,并讨论了动作捕捉在动画制作、虚拟现实、医疗康复等领域的广泛应用与发展前景。

apple5的专栏 220

js 抽象工厂模式

抽象类的主要作用:定义一个产品簇,声明必备的方法,如果子类没有重写就会抛出错误. var abstructFactory = function(child,father){ if(typeof abstructFactory[father] === 'function'){ function tempClass(){}; tempClass.prototype

小花的前端博客 431

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

[设计模式]装饰器模式(Decorator)

当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功能),就会增加类的复杂度。装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。其根本的思想和Python中的装饰器是一样的。(装饰器模型的别名就是包装器Wrap

sicofield的专栏 1531

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[设计模式]组合模式(Compostie)

1.意图        将对象组合成树状结构以表示“部分—整体”的层次结构。Composite使得用户对单个对象和组合的使用具有一致性(整体和部分一致对待)。 2.动机        在图形应用系统中可以用简单的组件(图元)创建复杂的组件(图表)。用户可以组合多个组件形成一个较大的组件(Winform开发中就有自定义控件),这些组件又可以组合成更大的组件。一个实现方法就是对组件定义一些类,另

sicofield的专栏 1420

蓝牙模块HM-10手册

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

[设计模式]状态模式 (State)

1.意图        允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 2.结构与参与者 3.适用性        1)一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。        2)一个操作中含有庞大的多分支的条件语句,并且这些分支依赖于该对象的状态。这个状态通常用一个或者多个枚举常量表示。通常,有多个操作包含这一相

sicofield的专栏 1243

[设计模式]模板方法模式(Template Method)

1.意图        定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2.动机        其实就是如意图所描述的,算法的骨架是一样的,就是有些特殊步骤不一样。就可以采用模板方法,将相同的功能上升到父类中去。其实说白了就有点C++的继承就是一个模板方法。 3.结构与参与者

sicofield的专栏 1234

[设计模式]观察者模式(Observer)

1.意图        定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 2.动机        将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使得各类紧密耦合,因为这样降低了它们的可重用性。        举个例子,一个表格对象和一个柱状图对象还有一个饼图对象,可以描述同

sicofield的专栏 1196

[设计模式]责任链模式(Chain of Resposibilty)

1.意图        使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 2.动机        好比《大话设计模式上》的请求加薪,需要层层上交批准。这样的话请求者和响应请求者之间强耦合会生成很多判断语句。这里的目的就是要将提交请求的对象和可能提供解决措施的对象解耦。并且这样的方式可以随时修改处理

sicofield的专栏 1130

[设计模式]代理模式(Proxy)

1.意图        为其他对象提供一种代理以控制对这个对象的访问。 2.结构与参与者 3.动机        对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。我们考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的开箱很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。因为并非所有这些对

sicofield的专栏 1117

[设计模式]桥接模式(Bridge)

1.意图        将抽象部分与它的实现部分分离,使它们都可以独立地变化。 这里说的意思不是让抽象基类与具体类分离,而是现实系统可能有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出来让它们独立变化,减少它们之间的耦合性,即如果继承不能实现“开放-封闭原则”的话,就应该考虑用桥接模式。如:让“手机”既可以按品牌分类也可以按软件类型分类。 2.动机        当一个抽象可能

sicofield的专栏 1112

[设计模式]享元模式(Flyweight)

1.意图        运用共享技术有效地支持大量细粒度的对象。 2.动机        有些应用程序在其整个设计过程中采用对象技术,但简单化的实现代价极大。        例如,Python等程序中字符串是一个对象。如下面的程序所示,a和b共享了同一个字符串。 >>> a="Hello World" >>> b="Hello World" >>> id(a) 14407008 >>>

sicofield的专栏 1062

[设计模式]建造者模式(Builder)

1.      意图        将一个复杂对象的构建于它的表示分离,使得同样的构建过程可以创建不同的表示。并且因为构建过程是标准化的,所以当需要标准化构建过程时也可以使用。 2.      结构与参与者 3.      效果 1) 它使你可以改变一个产品的内部表示        Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表

sicofield的专栏 959

[设计模式]单例模式(Singleton)

1.  意图        保证一个类仅有一个实例,并提供一个访问它的全局访问点。 2. 结构与参与者 3.效果 1)对唯一实例的受控访问        因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。 2)缩小名称空间        Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名称空间。

sicofield的专栏 891

[设计模式]备忘录模式(Memento)

1.意图        在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态。 2.动机        有时有必要记录一个对象的内部状态。为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制,你必须事先将状态信息保存在某处,这样才能将对象恢复到它们先前的状态。但是对象通常封装了其不封或所有的状态信息,使

sicofield的专栏 854
上一篇: [Python]用来定制类的特殊方法
下一篇: [设计模式]建造者模式(Builder)
sicofield
博客等级 码龄18年 169粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值