《大话设计模式》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 沉淀.分享.成长,让自己和他人都能有所收获!
随机推荐
- Flink – JobManager.submitJob
JobManager作为actor, case SubmitJob(jobGraph, listeningBehaviour) => val client = sender() val jobI ...
- easyUI表格多表头实现
项目中要实现表格多表头,结合网上的例子自己实现了一个,包含frozenColumns情况. 一,通过标签创建 效果: <table id="schoolGrid" class ...
- iOS如何接收服务端返回的布尔值
if ([user[@"chat"] boolValue]) { userModel.chat = ; }else { userModel.chat = ; } 关键是要调用boo ...
- LeetCode 897 Increasing Order Search Tree 解题报告
题目要求 Given a tree, rearrange the tree in in-order so that the leftmost node in the tree is now the r ...
- AVD启动报错:Running an x86 based Android Virtual Device (AVD) is 10x faster
1.cmd窗口中输入emulator -avd test 启动AVD时报错: Running an x86 based Android Virtual Device (AVD) is 10x fast ...
- 20165336 2017-2018-2 《Java程序设计》第2周学习总结
学号 2017-2018-2 20165336 <Java程序设计>第2周学习总结 教材学习内容总结 第二章 标识符第一个字符不能是数字 标识符不能是关键字 byte型变量的取值范围是-2 ...
- Git 常用命令和统计代码量
摘要 分享Git日常操作中常用的命令,分享如何统计在项目中贡献的代码量. 下面列出Git bash常用命令. 1. git clone **(项目地址) 克隆一个git项目到本地,将git项目拉取到本 ...
- python基础数据类型考试题
Python基础数据类型考试题 考试时间:两个半小时 满分100分(80分以上包含80分及格) 一,基础题. 1,简述变量命名规范(3分) 2,字节和位的关系 ...
- 1、 LwIP协议栈规范翻译——简介
1.简介 在过去几年中,计算机和计算机支持设备接之间的互联到无线网络日趋增加.计算机已经越来越无缝的集成在了日常的设备且价格也在下降.同时,无线网络技术例如蓝牙[HNI+98]和IEEE802.11b ...
- loadrunner压测工具
https://www.cnblogs.com/xxyBlogs/p/4579509.html https://www.cnblogs.com/jaazz/p/8668214.html