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

效果:

  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;
}

结束!

抽象工厂模式(AbsFactory)C++实现的更多相关文章

  1. 设计模式(四)——Java抽象工厂模式

    抽象工厂模式 1 基本介绍 1) 抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类 2) 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合. 3) ...

  2. PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  3. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  4. Objective-C 工厂模式(下) -- 抽象工厂模式

    相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的 抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产 比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买 ...

  5. Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  6. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  7. 设计模式(四)抽象工厂模式(Abstract Factory Pattern)

    一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建 ...

  8. php实现设计模式之 抽象工厂模式

    <?php /*抽象工厂模式:提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类 * 创建型模式 */ //抽象小米工厂,能制造小米一,小米二 abstract class mi ...

  9. 设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)

    定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往 ...

随机推荐

  1. Labview学习笔记(二)

    一.编程基础 LABVIEW程序成为虚拟.仪器程序,简称VI,一个最基本的VI包括三个部分:前面板.程序框图和图标/连接端口. 1.前面板 在前面板窗口中,可以添加输入控件和显示控件,同时,可以用快捷 ...

  2. 【剑指Offer】60、把二叉树打印成多行

      题目描述:   从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.   解题思路:   本题可类比第22题:从上往下打印二叉树,这两道题实际上是一回事,只不过这里我们多了一个分行打印 ...

  3. 【剑指Offer】3、从尾到头打印链表

      题目描述:   输入一个链表,按链表值从尾到头的顺序返回一个ArrayList.   解题思路:   (三种方法:借助栈.递归.列表的首位插入)   从头到尾打印链表比较简单,从尾到头很自然的可以 ...

  4. IE与标准浏览器对事件处理的区别

    1.监听 标准 element.addEventListener('click',observer, useCapture); element.removeEventListener('click', ...

  5. NLTK学习笔记(二):文本、语料资源和WordNet汇总

    目录 语料库基本函数表 文本语料库分类 常见语料库及其用法 载入自定义语料库 词典资源 停用词语料库 WordNet面向语义的英语字典 语义相似度 语料库基本函数表 示例 描述 fileids() 语 ...

  6. Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)

    哎呀大水题..我写了一个多小时..好没救啊.. 数论板子X合一? 注意: 本文中变量名称区分大小写. 题意: 给一个\(n\)阶递推序列\(f_k=\prod^{n}_{i=1} f_{k-i}b_i ...

  7. sync_binlog=1

    MySQL提供一个sync_binlog参数来控制数据库的binlog刷到磁盘上去. sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统自己控制它的缓存的刷新.这时候的性能 ...

  8. 【POJ 2486】 Apple Tree(树型dp)

    [POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8981   Acce ...

  9. 【待解决】使用JUnit时报错java.lang

    编写selenium自动化代码,代码逻辑应该都没有错,运行时老是报如下错误 java.lang.NoClassDefFoundError: org/json/JSONException 解决办法:导入 ...

  10. Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...