抽象工厂模式(大话设计模式)C/C++版本

2024-06-15 19:20

本文主要是介绍抽象工厂模式(大话设计模式)C/C++版本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

抽象工厂模式

在这里插入图片描述

C++

参考:https://www.cnblogs.com/Galesaur-wcy/p/15927110.html

#include <iostream>
using namespace std;// 抽象产品Department ,定义具体产品的公共接口
class Department
{
public:virtual ~Department() = default;virtual void Insert() = 0;virtual Department *GetDepartment() = 0;
};// 创建具体产品类SqlserDepartment, 定义生产的具体产品;
class SqlserDepartment : public Department
{
public:void Insert() override{cout << "在SQL Server 中给 Department 表增加一条记录!" << endl;}Department *GetDepartment() override{cout << "在SQL Server 中根据ID 得到 Department 表一条记录!" << endl;return nullptr;}
};// 创建具体产品类AccessDepartment, 定义生产的具体产品;
class AccessDepartment : public Department
{
public:void Insert() override{cout << "在 Access 中给 Department 表增加一条记录!" << endl;}Department *GetDepartment() override{cout << "在 Access 中根据ID 得到 Department 表一条记录!" << endl;return nullptr;}
};// 抽象产品User ,定义具体产品的公共接口
class User
{
public:virtual ~User() = default;virtual void Insert() = 0;virtual User *GetUser() = 0;
};// 创建具体产品类SqlserverUser, 定义生产的具体产品;
class SqlserverUser : public User
{
public:void Insert() override{cout << "在SQL Server 中给 User表增加一条记录!" << endl;}User *GetUser() override{cout << "在SQL Server 中根据ID 得到 User表一条记录!" << endl;return nullptr;}
};// 创建具体产品类AccessUser, 定义生产的具体产品;
class AccessUser : public User
{
public:void Insert() override{cout << "在 Access 中给 User表增加一条记录!" << endl;}User *GetUser() override{cout << "在 Access 中根据ID 得到 User表一条记录!" << endl;return nullptr;}
};// 抽象工厂,定义具体工厂的公共接口
class AbstractFactory
{
public:virtual ~AbstractFactory() = default;virtual User *CreateUser() = 0;virtual Department *CreateDepartment() = 0;
};// 创建具体工厂SqlServerFactory,定义创建对应具体产品实例的方法;
class SqlServerFactory : public AbstractFactory
{
public:User *CreateUser() override{return new SqlserverUser(); // 该工厂 生产的产品}Department *CreateDepartment() override{return new SqlserDepartment;}
};// 创建具体工厂AccessFactory,定义创建对应具体产品实例的方法;
class AccessFactory : public AbstractFactory
{
public:User *CreateUser() override{return new AccessUser(); // 该工厂 生产的产品}Department *CreateDepartment() override{return new AccessDepartment;}
};int main()
{// AbstractFactory *factory = new SqlServerFactory;AbstractFactory *factory = new AccessFactory;// 调用的是 AccessFactory 工厂,准备生产  SqlserverUser 产品User *iu = factory->CreateUser();iu->Insert();iu->GetUser();// 调用的是 AccessFactory 工厂,准备生产  AccessDepartment 产品Department *id = factory->CreateDepartment();id->Insert();id->GetDepartment();delete factory;delete iu;delete id;factory = nullptr;id = nullptr;id = nullptr;return 0;
}

C

#include <stdio.h>
#include <stdlib.h>// 抽象产品Department
typedef struct Department
{void (*Insert)(void *);struct Department *(*GetDepartment)(void *);
} Department;// 抽象产品User
typedef struct User
{void (*Insert)(void *);struct User *(*GetUser)(void *);
} User;// 抽象工厂
typedef struct AbstractFactory
{User *(*CreateUser)(void);Department *(*CreateDepartment)(void);
} AbstractFactory;// 具体产品SqlserDepartment
typedef struct SqlserDepartment
{Department base;
} SqlserDepartment;void SqlserDepartment_Insert(void *dept)
{printf("在SQL Server 中给 Department 表增加一条记录!\n");
}Department *SqlserDepartment_GetDepartment(void *dept)
{printf("在SQL Server 中根据ID 得到 Department 表一条记录!\n");return NULL;
}// 具体产品AccessDepartment
typedef struct AccessDepartment
{Department base;
} AccessDepartment;void AccessDepartment_Insert(void *dept)
{printf("在 Access 中给 Department 表增加一条记录!\n");
}Department *AccessDepartment_GetDepartment(void *dept)
{printf("在 Access 中根据ID 得到 Department 表一条记录!\n");return NULL;
}// 具体产品SqlserverUser
typedef struct SqlserverUser
{User base;
} SqlserverUser;void SqlserverUser_Insert(void *user)
{printf("在SQL Server 中给 User表增加一条记录!\n");
}User *SqlserverUser_GetUser(void *user)
{printf("在SQL Server 中根据ID 得到 User表一条记录!\n");return NULL;
}// 具体产品AccessUser
typedef struct AccessUser
{User base;
} AccessUser;void AccessUser_Insert(void *user)
{printf("在 Access 中给 User表增加一条记录!\n");
}User *AccessUser_GetUser(void *user)
{printf("在 Access 中根据ID 得到 User表一条记录!\n");return NULL;
}// 具体工厂SqlServerFactory
typedef struct SqlServerFactory
{AbstractFactory base;
} SqlServerFactory;User *SqlServerFactory_CreateUser(void *unused)
{SqlserverUser *user = (SqlserverUser *)malloc(sizeof(SqlserverUser));user->base.Insert = SqlserverUser_Insert;user->base.GetUser = SqlserverUser_GetUser;return (User *)user;
}Department *SqlServerFactory_CreateDepartment(void *unused)
{SqlserDepartment *dept = (SqlserDepartment *)malloc(sizeof(SqlserDepartment));dept->base.Insert = SqlserDepartment_Insert;dept->base.GetDepartment = SqlserDepartment_GetDepartment;return (Department *)dept;
}// 具体工厂AccessFactory
typedef struct AccessFactory
{AbstractFactory base;
} AccessFactory;User *AccessFactory_CreateUser()
{AccessUser *user = (AccessUser *)malloc(sizeof(AccessUser));user->base.Insert = AccessUser_Insert;user->base.GetUser = AccessUser_GetUser;return (User *)user;
}Department *AccessFactory_CreateDepartment()
{AccessDepartment *dept = (AccessDepartment *)malloc(sizeof(AccessDepartment));dept->base.Insert = AccessDepartment_Insert;dept->base.GetDepartment = AccessDepartment_GetDepartment;return (Department *)dept;
}int main()
{AbstractFactory *factory = (AbstractFactory *)malloc(sizeof(AccessFactory));((AccessFactory *)factory)->base.CreateUser = AccessFactory_CreateUser;((AccessFactory *)factory)->base.CreateDepartment = AccessFactory_CreateDepartment;User *iu = factory->CreateUser();iu->Insert(iu);iu->GetUser(iu);Department *id = factory->CreateDepartment();id->Insert(id);id->GetDepartment(id);free(factory);free(iu);free(id);return 0;
}

总结

在工厂方法模式的基础上,在对应的工厂类中新增了相关产品的创建函数。(其实并不是很方便!!)

扩展:
简单工厂模式似乎更简便点,但是switch部分实在是破坏了开闭原则,可以使用“反射”(即动态识别类型)

C++可以使用静态函数指针数组来实现
参考:https://blog.csdn.net/klarclm/article/details/7352101

这篇关于抽象工厂模式(大话设计模式)C/C++版本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064348

相关文章

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

C++的模板(八):子系统

平常所见的大部分模板代码,模板所传的参数类型,到了模板里面,或实例化为对象,或嵌入模板内部结构中,或在模板内又派生了子类。不管怎样,最终他们在模板内,直接或间接,都实例化成对象了。 但这不是唯一的用法。试想一下。如果在模板内限制调用参数类型的构造函数会发生什么?参数类的对象在模板内无法构造。他们只能从模板的成员函数传入。模板不保存这些对象或者只保存他们的指针。因为构造函数被分离,这些指针在模板外

C++工程编译链接错误汇总VisualStudio

目录 一些小的知识点 make工具 可以使用windows下的事件查看器崩溃的地方 dumpbin工具查看dll是32位还是64位的 _MSC_VER .cc 和.cpp 【VC++目录中的包含目录】 vs 【C/C++常规中的附加包含目录】——头文件所在目录如何怎么添加,添加了以后搜索头文件就会到这些个路径下搜索了 include<> 和 include"" WinMain 和

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

C/C++的编译和链接过程

目录 从源文件生成可执行文件(书中第2章) 1.Preprocessing预处理——预处理器cpp 2.Compilation编译——编译器cll ps:vs中优化选项设置 3.Assembly汇编——汇编器as ps:vs中汇编输出文件设置 4.Linking链接——链接器ld 符号 模块,库 链接过程——链接器 链接过程 1.简单链接的例子 2.链接过程 3.地址和

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C++学习 贝蒂的主页:Betty’s blog 1. 泛型编程 首先让我们来思考一个问题,如何实现一个交换函数? void swap(int& x, int& y){int tmp = x;x = y;y = tmp;} 相信大家很快就能写出上面这段代码,但是如果要求这个交换函数支持字符型

ONLYOFFICE 8.1 版本桌面编辑器测评

在现代办公环境中,办公软件的重要性不言而喻。从文档处理到电子表格分析,再到演示文稿制作,强大且高效的办公软件工具能够极大提升工作效率。ONLYOFFICE 作为一个功能全面且开源的办公软件套件,一直以来都受到广大用户的关注与喜爱。而其最新发布的 ONLYOFFICE 8.1 版本桌面编辑器,更是带来了诸多改进和新特性。本文将详细评测 ONLYOFFICE 8.1 版本桌面编辑器,探讨其在功能、用户

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了