模式意图:提供一个创建一系列相关或相互依赖对象的接口,二无需指定他们具体的类。

效果:

  1. 分离了具体的类。     使  a.客户与类的实现分离  b.客户通过抽象接口操纵实例  c.产品的类名在实现中被分离
  2. 它使得易于交换产品系列。     我们仅需转换到相应的工厂对象并从新创建接口,就能交换产品系列
  3. 有利于产品的一致性。  一个接口只能产生同一系列的对象
  4. 难以支持新种类的产品  因为接口确定了被创建的产品集合

代码实例:

头文件AbsDesk.h中定义了一个基类AbsDesk,和继承于它的两个类WoodDesk(代表过去用的桌) ,CreativeDesk (代表现在用的桌)

#ifndef _ABSDESK_
#define _ABSDESK_

#include <string>
using std::string;

class AbsDesk{
public:
AbsDesk(string name, double price):_mName(name), _mPrice(price){}
virtual void SetPrice(double price){_mPrice = price;}
virtual double GetPrice(){return _mPrice;}
string _mName;
private:
double _mPrice;
};

class WoodDesk : public AbsDesk{
public:
WoodDesk(double price, string shape)\
:AbsDesk("WoodDesk", price), _mShape(shape){}

string _mShape;
};

class CreativeDesk : public AbsDesk{
public:
CreativeDesk(double price, string shape)\
:AbsDesk("CreativeDesk", price), _mShape(shape){}

string _mShape;
};

#endif

在头文件AbsBed.h中定义了基类AbsBed,和继承于它的WoodBed 、Simmons (分别代表过去和现代用的床)

#ifndef _ABSBED_
#define _ABSBED_

#include <string>
using std::string;

class AbsBed{
public:
AbsBed(string name, double price):_mName(name), _mPrice(price){}
virtual void SetPrice(double price){_mPrice = price;}
virtual double GetPrice(){return _mPrice;}
string _mName;
private:
double _mPrice;
};

class WoodBed : public AbsBed{
public:
WoodBed(double price, double len, double wid)\
:AbsBed("WoodBed", price), _mLength(len), _mWidth(wid){}

double _mLength;
double _mWidth;
};

class Simmons : public AbsBed{
public:
Simmons(double price, double len, double wid)\
:AbsBed("Simmons", price), _mLength(len), _mWidth(wid){}

double _mLength;
double _mWidth;
};

#endif

在头文件AbsFactory中定义了基类AbsFactory,和BeforeFactory ,NowFactory (分别产生过去和现代用品)

#ifndef _FACTORY_
#define _FACTORY_
#include "AbsBed.h"
#include "AbsDesk.h"

class AbsFactory{
public:
AbsFactory(){}
virtual AbsDesk* MakeDesk(double price, string shape) const = 0;
virtual AbsBed* MakeBed(double price, double len, double wid) const = 0;
};

class BeforeFactory : public AbsFactory{
public:
BeforeFactory(){}
virtual AbsDesk* MakeDesk(double price, string shape) const\
{return new WoodDesk(price, shape);}

virtual AbsBed* MakeBed(double price, double len, double wid) const\
{return new WoodBed(price, len, wid);}
};

class NowFactory : public AbsFactory{
public:
NowFactory(){}
virtual AbsDesk* MakeDesk(double price, string shape) const\
{return new CreativeDesk(price, shape);}

virtual AbsBed* MakeBed(double price, double len, double wid) const\
{return new Simmons(price, len, wid);}
};

#endif

在main文件中:

#include <iostream>
#include <string>
using namespace std;

#include "AbsFactory.h"

int main()
{

/////////////////////////////////////////////////////////////////////////用抽象工厂产生了过去用品
AbsFactory* pFactory = new BeforeFactory;

//效果1.这里客户调用函数实现类,分离了类的实现。因为调用的事函数,客户并不是的具体的类名。

AbsBed* pBed = pFactory->MakeBed(100, 200, 180);
AbsDesk* pDesk = pFactory->MakeDesk(100, "circle");

//效果1.客户通过抽象接口操纵实例
cout<<pBed->_mName<<endl;     //输出:WoodBed
cout<<pDesk->_mName<<endl;    //输出: WoodDesk

/////////////////////////////////////////////////////////////////////////

//在不修改原代码的情况下添加了现代的Simmons和CreativeDesk //

//使抽象工厂生产了现代系列产品,体现了效果2.易于交换系列产品 //

/////////////////////////////////////////////////////////////////////////用抽象工厂产生了现代用品

pFactory = new NowFactory;

pBed = pFactory->MakeBed(100, 200, 180);
pDesk = pFactory->MakeDesk(100, "circle");
cout<<pBed->_mName<<endl;     //输出: Simmons
cout<<pDesk->_mName<<endl;    //输出: CreativeDesk

//////////////////////////////////////////////////////////////////////////

//但是因为工厂接口已经确定了产品,在不改变接口代码的情况下难以//

//在产生其它用品,如:凳子。这体现了效果4            //

//效果3:一个应用只能使用同一个系列中的对象,所以有利于产品的//

//一致性                           //

//////////////////////////////////////////////////////////////////////////

return 0;
}

结束!

最新文章

  1. 虚拟机下CentOS 配置IP地址的三种方法
  2. 机器学习实战(一)kNN
  3. 高端大气上档次!10个精美的国外HTML5网站欣赏
  4. vim 显示颜色脚本
  5. Python学习笔记- Python threading模块
  6. python 列表转为字典的两个小方法
  7. centos源码安装git
  8. 【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位网友补充完善
  9. C语言习题 链表建立,插入,删除,输出
  10. notify丢失、虚假唤醒
  11. CF917D Stranger Trees
  12. wxWidgets与其它GUI工具库比较
  13. 多线程系列之六:Producer-Consumer模式
  14. qt 实现的电视遥控系统,如何让qt响应来自遥控器的按键信息?
  15. __getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)
  16. 安装php7.2并且整合nginx且分开部署
  17. poj2386(简单的dfs/bfs)
  18. docker swarm 英文参考资料阅读列表
  19. sql语句实战
  20. 相亲神器记录Swift1.2

热门文章

  1. springboot 多数据源的实现
  2. TensorFlow实战笔记(17)---TFlearn
  3. 【剑指Offer】58、对称的二叉树
  4. SSO 单点登录解决方案
  5. SQL第二节课
  6. JS 常用语法
  7. 复习C语言基础知识(day02)
  8. 游标后面select 带有in时
  9. Netty学习总结(3)——Netty百万级推送服务
  10. mdl 锁 SYSTEMTAP跟踪