1.意图

提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。

2.适用性

  • 一个系统要独立于它的产品创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  • 当你强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当你提供一个产品的类库,而只想显示它们的接口而不是实现时。

3.结构图

如上图所示为抽象工厂的结构图,每一个工厂负责创建一系列产品。

4.C++代码实例

#include <cstdlib>
#include <string>
class AbstractFactory; class Client
{
public:
Client(){};
~Client(){};
AbstractFactory *GetFactory(std::string type);
private:
AbstractFactory *pFactory; };

Client.h

 class AbstractProductA
{
public:
AbstractProductA()
{
}
virtual ~AbstractProductA()
{
};
}; class AbstractProductB
{
public:
AbstractProductB()
{
}
virtual ~AbstractProductB()
{
};
};

AbstractProduct

 class AbstractProductA;
class AbstractProductB; class AbstractFactory
{
public:
AbstractFactory()
{
};
~AbstractFactory(){};
virtual AbstractProductA * CreateProductA()=;
virtual AbstractProductB * CreateProductB()=;
};

AbstractFactory

 #include "AbstractFactory.h"

 class AbstractProductA;
class AbstractProductB; class ConcreteFactory1 : public AbstractFactory
{
public:
ConcreteFactory1();
~ConcreteFactory1();
AbstractProductA * CreateProductA();
AbstractProductB * CreateProductB();
}; class ConcreteFactory2 : public AbstractFactory
{
public:
ConcreteFactory2();
~ConcreteFactory2();
AbstractProductA * CreateProductA();
AbstractProductB * CreateProductB();
};

ConcreteFactory

 #include <cstdio>
#include <cstdlib>
#include <iostream>
#include "AbstractProduct.h" class ConcreteProductA1 : public AbstractProductA
{
public:
ConcreteProductA1()
{
std::cout << "ConcreteProductA1 is Created" << std::endl;
}
~ConcreteProductA1()
{
}
}; class ConcreteProductA2 : public AbstractProductA
{
public:
ConcreteProductA2()
{
std::cout << "ConcreteProductA2 is Created" << std::endl;
}
~ConcreteProductA2()
{
}
}; class ConcreteProductB1 : public AbstractProductB
{
public:
ConcreteProductB1()
{
std::cout << "ConcreteProductB1 is Created" << std::endl;
} ~ConcreteProductB1()
{
} }; class ConcreteProductB2 : public AbstractProductB
{
public:
ConcreteProductB2()
{
std::cout << "ConcreteProductB2 is Created" << std::endl;
} ~ConcreteProductB2()
{
}
};

ConcereteProduct

#include "ConcreteFactory.h"
#include "ConcreteProduct.h" ConcreteFactory1::ConcreteFactory1()
{
} ConcreteFactory1::~ConcreteFactory1()
{
} AbstractProductA * ConcreteFactory1::CreateProductA()
{
auto product = new ConcreteProductA1();
return product;
} AbstractProductB * ConcreteFactory1::CreateProductB()
{
auto product = new ConcreteProductB1();
return product;
} ConcreteFactory2::ConcreteFactory2()
{
} ConcreteFactory2::~ConcreteFactory2()
{
} AbstractProductA * ConcreteFactory2::CreateProductA()
{
auto product = new ConcreteProductA2();
return product;
} AbstractProductB * ConcreteFactory2::CreateProductB()
{
auto product = new ConcreteProductB2();
return product;
}

ConcreteFactory.cpp

#include "Client.h"
#include "ConcreteFactory.h" AbstractFactory *Client::GetFactory(std::string type)
{
if("" == type)
{
auto pFactory = new ConcreteFactory1();
return pFactory;
}
else if ("" == type)
{
auto pFactory = new ConcreteFactory2();
return pFactory;
}
}

Client.cpp

#include "Client.h"
#include "AbstractFactory.h"
#include "AbstractProduct.h" int main()
{
auto client = new Client();
auto pFactory = client->GetFactory("");
auto pProductA = pFactory->CreateProductA();
auto pProductB = pFactory->CreateProductB();
delete pProductB;
pProductB = NULL;
delete pProductA;
pProductA = NULL;
delete pFactory;
pFactory = NULL; pFactory = client->GetFactory("");
pProductA = pFactory->CreateProductA();
pProductB = pFactory->CreateProductB();
delete pProductB;
pProductB = NULL;
delete pProductA;
pProductA = NULL;
delete pFactory;
pFactory = NULL;
delete client;
client=NULL; while(); }

TestCode.cpp

测试结果:

如测试代码中所写,先创建1系列的产品A和B,后创建2系列的产品A和B。

5.效果

  • 分离了具体的类,产品的类名不出现在测试代码(即客户代码)中。
  • 使得易于交换产品系列。
  • 利于产品的一致性。
  • 难以支持新种类的产品

6.相关模式

抽象工厂类通常用工厂方法实现,但是也可以用原型实现。一个具体的工厂通常是一个单件。

Abstract Factory(抽象工厂)模式的更多相关文章

  1. c++ 设计模式9 (Abstract Factory 抽象工厂模式)

    5.2 抽象工厂模式 动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sq ...

  2. 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

    1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...

  3. Java设计模式:Abstract Factory(抽象工厂)模式

    概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...

  4. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

  5. Abstract Factory抽象工厂模式

    抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...

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

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

  7. Abstract Factory 抽象工厂模式

    提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...

  8. 2.设计模式-Abstract Factory 抽象工厂模式

    大神勿喷,不对的地方请指出来,学笔记而已. 解决的问题:应对多系列对象构建的变化或多系列(例如:崎岖的山路和平坦的马路属于一个系列) 不断的变化的创建. 使用场景:对象不变(比如有3个对象 " ...

  9. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  10. Abstract Factory 抽象工厂(创建型模式)

    1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...

随机推荐

  1. ECShop函数列表大全

    lib_time.php gmtime() P: 获得当前格林威治时间的时间戳 /$0 server_timezone() P: 获得服务器的时区 /$0 local_mktime(hour=NULL ...

  2. trace工具,c++/c#/python

    下载地址: http://files.cnblogs.com/files/wjx0912/xtrace.rar 很方便的调试工具,已在c#,  vc2015, python2.7.10环境下测试. 闭 ...

  3. 并查集——HDOJ-1232-畅通工程

    并查集 并查集(Union-Find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题,在合并之前,需要先判断两个元素是否属于同一集合,这就需要用查找操作来实现.一些常 ...

  4. Java 学习总结(一)

    1.     概述 1.1           dos命令行--常见的命令 l  dir : 列出当前目录下的文件以及文件夹 l  md : 创建目录 l  rd : 删除目录 l  cd : 进入指 ...

  5. ACM_ICPC hdu-2111(简单贪心算法)

    一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...

  6. 【python】类的继承和多态

    比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self): print 'Animal is r ...

  7. Unity3D外包团队——技术分享U3D全景漫游(三)

    22.给每个物体都附上贴图,如果是纯色物体,也付给纯色贴图 23.打光后,选择要烘培的物体 设置输出路径 添加烘培输出的贴图类型 添加“LightingMap”类型 设置烘培贴图大小和目标贴图位置为“ ...

  8. ES6转换为ES5

    1.静态函数 1.什么是静态函数 静态函数最重要的就是不用创建一个实例变量就可以进行调用,在C++里面,无法访问this对象, 而在JS里面由于js的this对象支持,是可以访问this对象,只是th ...

  9. Win7 远程桌面 错误代码:5 异常处理(您的远程桌面会话即将结束 此计算机的虚拟内存可能不足。请关闭其他程序,然后重试连接远程计算机。如果问题仍然存在,请联系网络管理员或技术支持。)

    问题表现: 在用windows7 远程桌面连接其他电脑时,出现错误提示对话框—-标题为“严重错误(错误代码:5)”,内容为“您的远程桌面会话即将结束 此计算机的虚拟内存可能不足.请关闭其他程序,然后重 ...

  10. [转]App Store 审核、限时免费、排行、推荐机制技巧精华汇总

    在 App Store 上,什么样的应用会得到推荐? 这个问题问的非常大,而且编辑推荐很多个人元素在里面,我试着用推荐Ovi Store应用的思路来回答一下: 关于应用: 1.首先这个应用最基本的功能 ...