《大话设计模式》c++实现 抽象工厂模式
为了更清晰地理解工厂方法模式,需要先引入两个概念:
- 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
- 产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
抽象工厂模式包含如下角色:
- AbstractFactory:抽象工厂
- ConcreteFactory:具体工厂
- AbstractProduct:抽象产品
- Product:具体产品
在上例中,产品族包括两个:1和2,也就是Sqlserver数据库和Access数据库。
每个产品族里面又包含两类产品:A和B,也就是User表和Department表。
而每个产品族中的产品要一起使用,就是说产品族1中的两类产品A和B要一起使用,也就是说在SqlServer数据库中SqlServerUser表和SqlServerDepartment表要一起使用,Access数据库同理。
工厂角度:
SqlFactory:
User:
//具体产品A1 SqlProductA
Department:
//具体产品B1 SqlProductB
AccessFactory:
User:
//具体产品A2 AccessProductA
Department:
//具体产品B2 AccessProductB
产品角度:
AbstractProductA(user 表):
//具体产品A1 SqlProductA
//具体产品A2 AccessProductA
AbstractProductB(Department表)
//具体产品B1 SqlProductA
//具体产品B2 AccessProductA
- #include<string>
- #include<iostream>
- //数据库表项:User 与工厂模式无关
- class User
- {
- private:
- int id;
- std::string name;
- public:
- int getID()
- {
- return id;
- }
- std::string getName()
- {
- return name;
- }
- void setID(int ID)
- {
- this->id = ID;
- }
- void setName(std::string NAME)
- {
- this->name = NAME;
- }
- };
- //数据库表项:Department 与工厂模式无关
- class Department
- {
- private:
- int id;
- std::string name;
- public:
- int getID()
- {
- return id;
- }
- std::string getName()
- {
- return name;
- }
- void setID(int ID)
- {
- this->id = ID;
- }
- void setName(std::string NAME)
- {
- this->name = NAME;
- }
- };
- //抽象产品A:IUser
- class AbstractProductA{
- public:
- virtual void Insert(User user) = ;
- virtual User* GetUser(int id) = ;
- };
- //具体产品A1 SqlProductA
- class SqlProductA :public AbstractProductA{
- public:
- void Insert(User user){
- std::cout << "在SQL Server中给User表增加了一条记录" << std::endl;
- }
- User* GetUser(int id){
- std::cout << "在SQL Server中得到id为:"<<id<<" User表一条记录" << std::endl;
- return NULL;
- }
- };
- //具体产品A2 AccessProductA
- class AccessProductA :public AbstractProductA{
- public:
- void Insert(User user){
- std::cout << "在Access中给User表增加了一条记录" << std::endl;
- }
- User* GetUser(int id){
- std::cout << "在Access中得到id为:" << id << " User表一条记录" << std::endl;
- return NULL;
- }
- };
- //抽象产品B:IDepartment
- class AbstractProductB{
- public:
- virtual void Insert(Department department) = ;
- virtual Department* GetDepartment(int id) = ;
- };
- //具体产品B1 SqlProductB
- class SqlProductB :public AbstractProductB{
- public:
- void Insert(Department department){
- std::cout << "在SQL Server中给department表增加了一条记录" << std::endl;
- }
- Department* GetDepartment(int id){
- std::cout << "在SQL Server中得到id为:" << id << " Department表一条记录" << std::endl;
- return NULL;
- }
- };
- //具体产品B2 AccessProductB
- class AccessProductB :public AbstractProductB{
- public:
- void Insert(Department department){
- std::cout << "在Access中给department表增加了一条记录" << std::endl;
- }
- Department* GetDepartment(int id){
- std::cout << "在Access中得到id为:" << id << " Department表一条记录" << std::endl;
- return NULL;
- }
- };
- class AbstractFactory{
- public:
- virtual AbstractProductA* createProductA() = ;
- virtual AbstractProductB* createProductB() = ;
- };
- //具体工厂1:SqlServerFactory
- class SqlFactory :public AbstractFactory
- {
- public:
- AbstractProductA* createProductA()
- {
- return new SqlProductA;
- }
- AbstractProductB* createProductB()
- {
- return new SqlProductB;
- }
- };
- //具体工厂2:AccessFactory
- class AccessFactory :public AbstractFactory{
- public:
- AbstractProductA* createProductA()
- {
- return new AccessProductA;
- }
- AbstractProductB* createProductB()
- {
- return new AccessProductB;
- }
- };
- void main()
- {
- //初始化数据库
- User user;
- Department department;
- //ConcreteFactory1
- AbstractFactory* factory = NULL;
- //factory = new SqlFactory;
- factory = new AccessFactory;
- //ProductA1
- AbstractProductA* iu = NULL;
- iu = factory->createProductA();
- iu->Insert(user);
- iu->GetUser();
- //ProductB1
- AbstractProductB* id = NULL;
- id = factory->createProductB();
- id->Insert(department);
- id->GetDepartment();
- if (factory != NULL)
- {
- delete factory;
- factory = NULL;
- }
- if (iu != NULL)
- {
- delete iu;
- iu = NULL;
- }
- if (id != NULL)
- {
- delete id;
- id = NULL;
- }
- system("pause");
- }
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html
https://blog.csdn.net/xiqingnian/article/details/41181995
《大话设计模式》c++实现 抽象工厂模式的更多相关文章
- 大话设计模式C++版——抽象工厂模式
前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...
- 大话设计模式Python实现- 抽象工厂模式
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env pyth ...
- JAVA常用设计模式(一、抽象工厂模式)
抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...
- 设计模式学习心得<抽象工厂模式 Abstract Factory>
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- C#设计模式系列:抽象工厂模式(AbstractFactory)
出自:http://www.cnblogs.com/libingql/archive/2012/12/09/2809754.html 1. 抽象工厂模式简介 1.1 定义 抽象工厂(Abstract ...
- [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式
注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...
- IOS设计模式浅析之抽象工厂模式(Abstract Factory)
概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...
- 【java设计模式】-03抽象工厂模式
抽象工厂 简述 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.在抽象工厂模式中,接口是负责创建一个相关对象的工厂 ...
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
随机推荐
- 解决pathForResource返回nil, 无法读取plist文件问题
有很多人在设置plist文件的时候, 会发现读取不了plist文件里面的内容, 返回值为nil, 下面我们来解决一下这个问题. 首先我们打开工程并且按照下面的步骤来设置: 设置好后, 我们来写一段代码 ...
- SR锁存器
CRM(临界连续模式)BOOST PFC 电路控制系统 SR锁存器 S和R都等于0的时候为什么有两个不同的Q?正因为这样才叫锁存器.Q’是Q的取反,不可能相同.Q*和Q‘不一样.Q是Q*的前一个状态. ...
- multiDex分包时指定主dex的class列表
在gradle中我们使用了如下代码可以将指定类型分配到主dex中: afterEvaluate { tasks.matching { it.name.startsWith('dex') }.each ...
- 如何在安装node\npm\cnpm
1.安装node.js node.js的官方地址为:https://nodejs.org/en/download/. 根据windows版本后,选择要下载的安装包,下载完毕,按照windows一般应用 ...
- 洛谷P4247 序列操作 [清华集训] 线段树
正解:线段树 解题报告: 传送门! 通过这题我get了一个神奇的,叫,线段树五问的东西hhhh 听起来有点中二但感觉真正做题的时候还是比较有用的,,,?感觉会让条理清晰很多呢,所以放一下QwQ →每个 ...
- 【Python全栈-JavaScript】JavaScript入门
JavaScript基础知识点 一.JavaScript概述 参考:http://www.w3school.com.cn/b.asp JavaScript的历史 1.1992年Nombas开发出C-m ...
- IGMP协议
IGMP报文格式: 4bit的IGMP版本(1)+4bit的IGMP类型(1-2)+8bit未用+16bit检验和(同ICMP)+32bit组地址(D类IP地址) 类型为1说明是由多播路由器发出的查询 ...
- python-面向对象-05_面向对象封装案例 II
面向对象封装案例 II 目标 士兵突击案例 身份运算符 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象, ...
- wget 下载命令
//下载单个文件 wget http://116.199.2.206:81/2Q2WADC9FB8D469200FF61C643601888142263926D08_unknown_65A3E1A23 ...
- Hibernate三种状态,缓存,以及update更新问题
一. Hibernate中对象的三种状态 1. 瞬时状态(transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,此时该对象只是通过JVM获得了一块 ...