大话设计模式C++实现-第15章-抽象工厂模式
一、UML图
二、概念
抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类。
三、包括的角色
(1)抽象工厂
(2)详细工厂:包含详细工厂1和详细工厂2。详细工厂1用于生产详细产品A1和详细产品B1,详细工厂2用于生产详细产品A2和详细产品B2;
(3)抽象产品:包含抽象产品A和抽象产品B。
(4)详细产品:包含抽象产品A所相应的详细产品A1和A2。以及抽象产品B所相应的详细产品B1和B2.
说明:在《大话设计模式》中,上述的1和2分别代表Sqlserver数据库和Access数据库。上述的A和B分别代表数据库中的User表和Department表。
四、优势
(1)抽象工厂模式是对工厂方法模式的改进。
用于处理产品不仅仅有一类的情况(工厂方法模式下。产品仅仅有User这一类,而抽象工厂模式下。产品包含User和Department两类)。
(2)在下面情况下应当考虑使用抽象工厂模式:
- 一个系统不应当依赖于产品类实例怎样被创建、组合和表达的细节,这对于全部形态的工厂模式都是重要的。
- 这个系统有多于一个的产品族。而系统仅仅消费当中某一产品族。
- 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
- 系统提供一个产品类的库,全部的产品以相同的接口出现,从而使client不依赖于实现。
(3)解读:
在上例中。产品族包括两个:1和2,也就是Sqlserver数据库和Access数据库。
每一个产品族里面又包括两类产品:A和B,也就是User表和Department表。而每一个产品族中的产品要一起使用,就是说产品族1中的两类产品A和B要一起使用,也就是说在SqlServer数据库中SqlServerUser表和SqlServerDepartment表要一起使用,Access数据库同理。
五、C++实现
(1)代码
#include <iostream>
#include <cstdlib> using namespace std; //数据库表项:User
class User
{
private:
int id;
string name;
public:
int getID()
{
return id;
}
string getName()
{
return name;
}
void setID(int ID)
{
this->id=ID;
}
void setName(string NAME)
{
this->name=NAME;
}
}; //数据库表项:Department
class Department
{
private:
int id;
string name;
public:
int getID()
{
return id;
}
string getName()
{
return name;
}
void setID(int ID)
{
this->id=ID;
}
void setName(string NAME)
{
this->name=NAME;
}
}; //抽象产品A:IUser
class IUser
{
public:
virtual void Insert(User user)=0;
virtual User* GetUser(int id)=0;
};
//详细产品A1:SqlserverUser
class SqlserverUser:public IUser
{
public:
void Insert(User user)
{
cout<<"在SQL Server中给User表添加了一条记录"<<endl;
}
User* GetUser(int id)
{
cout<<"在SQL Server中依据ID得到User表一条记录"<<endl;
return NULL;
}
};
//详细产品A2:AccessUser
class AccessUser:public IUser
{
public:
void Insert(User user)
{
cout<<"在Access中给User表添加了一条记录"<<endl;
}
User* GetUser(int id)
{
cout<<"在Access中依据ID得到User表一条记录"<<endl;
return NULL;
}
}; //抽象产品B:IDepartment
class IDepartment
{
public:
virtual void Insert(Department department)=0;
virtual Department* GetDepartment(int id)=0;
};
//详细产品B1:SqlserverDepartment
class SqlserverDepartment:public IDepartment
{
public:
void Insert(Department department)
{
cout<<"在Sql Server中给Department表加入了一条记录"<<endl;
}
Department* GetDepartment(int id)
{
cout<<"在SQL Server中依据ID得到Department表的一条记录"<<endl;
return NULL;
}
};
//详细产品B2:AccessDepartment
class AccessDepartment:public IDepartment
{
public:
void Insert(Department department)
{
cout<<"在Access中给Department表加入了一条记录"<<endl;
}
Department* GetDepartment(int id)
{
cout<<"在Access中依据ID得到Department表的一条记录"<<endl;
return NULL;
}
}; //抽象工厂:IFactory
class IFactory
{
public:
virtual IUser* CreateUser()=0;
virtual IDepartment* CreateDepartment()=0;
};
//详细工厂1:SqlServerFactory
class SqlserverFactory:public IFactory
{
public:
IUser* CreateUser()
{
return new SqlserverUser;
} IDepartment* CreateDepartment()
{
return new SqlserverDepartment;
}
};
//详细工厂2:AccessFactory
class AccessFactory:public IFactory
{
public:
IUser* CreateUser()
{
return new AccessUser;
} IDepartment* CreateDepartment()
{
return new AccessDepartment;
}
}; //client
void main()
{
User user;
Department department; //ConcreteFactory1
IFactory* factory=NULL;
factory=new SqlserverFactory; //ProductA1
IUser* iu=NULL;
iu=factory->CreateUser();
iu->Insert(user);
iu->GetUser(1); //ProductB1
IDepartment* id=NULL;
id=factory->CreateDepartment();
id->Insert(department);
id->GetDepartment(1); if(factory!=NULL)
{
delete factory;
factory=NULL;
}
if(iu!=NULL)
{
delete iu;
iu=NULL;
}
if(id!=NULL)
{
delete id;
id=NULL;
} system("pause");
}
(2)执行截图
大话设计模式C++实现-第15章-抽象工厂模式的更多相关文章
- 大话设计模式C++实现-第1章-简单工厂模式
一.UML图 二.包括的角色 简单工厂模式包括三个角色: (1)工厂类Factory:工厂类是用来制造产品的. 因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类 ...
- 设计模式之第2章-抽象工厂模式(Java实现)
设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...
- 第3章 抽象工厂模式(Abstract Factory)
原文 第3章 抽象工厂模式(Abstract Factory) 场景我们的系统要同时支持两个数据库 SqlServer 跟Oracle数据库 并且不同的环境要进行随时切换. 看下面的代码: 1 2 ...
- 第 6 章 抽象工厂模式【Abstract Factory Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> 好了,我们继续上一节课,上一节讲到女娲造人,人是造出来了,世界时热闹了,可是低头一看,都 是清一色的类型,缺少关爱.仇恨 ...
- 《大话设计模式》ruby版代码:简单工厂模式
之前有看过<ruby设计模式>,不过渐渐的都忘记了.现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下. # -*- encoding: utf-8 -*- #运 ...
- 设计模式成长记(一) 抽象工厂模式(Abstract Factory)
目录 定义 UML类图 参与者 编写代码 特点 定义 提供一个创建一系列相关或相互依赖的对象的接口,而无需指定具体的类. 使用频率: UML类图 参与者 AbstractFactory:声明一个创建抽 ...
- headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式
先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...
- java之设计模式工厂三兄弟之抽象工厂模式
[学习难度:★★★★☆,使用频率:★★★★★] 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...
- 设计模式 — 抽象工厂模式(Abstract Factory)
工厂模式已经分析了简单工厂模式和工厂方法模式.并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式.由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂 ...
随机推荐
- 虚拟机创建后该如何获取IP地址并访问互联网实用教程
之前在做项目的时候主机IP地址.网关.DNS.子网掩码等都是公司或者对方直接给提供的,但是如果我们自己想搭建一台虚拟机或者一台集群的话,手头又没有IP地址,该肿么办呢? 白慌,这里介绍一个小技巧, ...
- [国家集训队]最长双回文串 (PAM)回文自动机
Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorithm> #include <cstr ...
- GDOI2016酱油记(补发)
这篇酱油记是前年发在MCHacker一个叫code-hub的博客上的(已崩),现在来补发一下... GDOI2016扯淡(爆零记) 大家好,我是巨弱DCDCBigBig,在五一期间和一群神牛去考GDO ...
- POJ 3261 Milk Patterns(后缀数组+单调队列)
题意 找出出现k次的可重叠的最长子串的长度 题解 用后缀数组. 然后求出heigth数组. 跑单调队列就行了.找出每k个数中最小的数的最大值.就是个滑动窗口啊 (不知道为什么有人写二分,其实写啥都差不 ...
- POJ 3134 Power Calculus (迭代剪枝搜索)
题目大意:略 题目里所有的运算都是幂运算,所以转化成指数的加减 由于搜索层数不会超过$2*log$层,所以用一个栈存储哪些数已经被组合出来了,不必暴力枚举哪些数已经被搜出来了 然后跑$iddfs$就行 ...
- Git 修改commit message
1.git log --oneline -5 查看最近5次commit的简要信息,输出信息为:简短commitID commit_message,可以根据需要查看最近n次的提交 也可以git log ...
- 【codeforces 257D】Sum
[题目链接]:http://codeforces.com/problemset/problem/257/D [题意] 给你n个数字; 这n个数字组成的数组满足: a[i-1]<=a[i]< ...
- Mysql学习总结(29)——MySQL中CHAR和VARCHAR
MySQL数据库的字符(串)类不要以为字符类型就是CHAR,CHAR和VARCHAR的区别在于CHAR是固定长度,只要你定义一个字段是CHAR(10),那么不论你存储的数据是否达到了10个字节,它都要 ...
- Mysql学习总结(22)——Mysql数据库中制作千万级测试表
前言: 为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张千万记录用户表. 步骤: 1 创建数据表(MYISAM方式存储插入速度比innodb方式快很多) 数据表描述 数 ...
- POJ——T3352 Road Construction
http://poj.org/problem?id=3352 vis表示访问的次序 low的值相同的点在同一连通分量 #include <algorithm> #include <c ...