《大话设计模式》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 沉淀.分享.成长,让自己和他人都能有所收获!
随机推荐
- dp进阶——饥饿的奶牛
饥饿的奶牛oj上n只有1000,过于水,O(n^2)的算法很容易水过,洛谷上这是一道提高加的题,很难啊,所以要好好拿来练习今天写博客再次复习一下,oi最怕遗忘了. 这道题呢实质是一个区间覆盖的dp,首 ...
- $ORACLE_HOME/OPatch/opatch lsinventory查oracle补丁
> $ORACLE_HOME/OPatch/opatch lsinventoryInvoking OPatch 10.2.0.4.2 Oracle Interim Patch Installer ...
- js中的事件轮询(event loop)机制
异步任务指的是,不进入主线程.而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行. ...
- java JDBC (四)
package cn.sasa.demo4; import java.sql.Connection; import java.sql.PreparedStatement; import java.sq ...
- 【PyQt5-Qt Designer】猜数字(小项目)
参考:https://zhuanlan.zhihu.com/p/28287825 https://www.cnblogs.com/hhh5460/p/5174266.html 最终效果: 本次练习涉及 ...
- Machine Learning in action --LogisticRegession 逻辑回归
本系列主要参考<机器学习实战>,使用python3编译环境,实现书中的相关代码. 1.基本算法 关于梯度上升算法和随机梯度上升算法的选择: 当数据集较小时,使用梯度上升算法: 当数据集较大 ...
- SQL优化之踩过的坑【一】
正看资料看的过瘾,突然收到报警,说服务器负载太高,好吧,登录服务器看看,我擦嘞,还能不能愉快的玩耍了?下面是当时的负载情况 看见mysql使用cpu已经到了2000,io没有等待.说明应该没有大的临时 ...
- 前端 HTML body标签相关内容 常用标签 分割线 <hr>
分割线 <hr> <hr>标签用来在HTML页面中创建水平分隔线,通常用来分隔内容 <!DOCTYPE html> <html lang="en&q ...
- 20181017 PL/SQL 记录
1. 配置DB 链接文件,帮助中找到tnsnames.ora文件路径,进行注册数据库信息,登陆即可. 这只是个客户端,具体服务器段数据库情况不清楚. 2.写法区别PL/SQL 和SQL 变量定义 赋值 ...
- MySQL 5.7 并行复制
一.缘由: 某天看到主从复制延时的告警有点频繁,就想着是不是彻底可以解决一下. 一般主从复制,有三个线程参与,都是单线程:Binlog Dump(主) ----->IO Thread (从) - ...