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

抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具体实现,创建一组具体的对象。

以下情况可以使用抽象工厂模式:

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

抽象工厂模式的优缺点:

  • 他分离了具体的类
  • 它使得易于交换产品系列
  • 它有利于产品的一致性
  • 难以支持新种类的产品

在实现时最好将工厂作为单件。

如果有多个可能的产品系列,具体工厂也可以使用Prototype原型模式来实现。具体工厂使用产品系列中每一个产品的实例来初始化,且通过复制它的原型来创建新的产品。在基于原型的方法中,使得不是每个新的产品系列都需要一个新的具体工厂类。

定义可扩展的工厂。比如用参数指定将被创建的对象的种类。注意所有的产品都将返回相同类型的抽象接口给用户,可以用dynamic_cast进行类型转换,但是也有可能失败。

 #include <iostream>
#include <string> class AbstractProduct {
public:
virtual ~AbstractProduct() {}
virtual void message() = ;
};
class Product : public AbstractProduct {
virtual ~Product() {}
virtual void message() {
std::cout << "我是一个普通的Product" << std::endl;
}
};
class ProductEx : public AbstractProduct {
virtual ~ProductEx() {}
virtual void message() {
std::cout << "我是加强后的Product" << std::endl;
}
}; class AbstractObject {
public:
virtual ~AbstractObject() {}
virtual void gao() = ;
};
class Object : public AbstractObject {
virtual ~Object() {}
virtual void gao() {
std::cout << "虽然叫做Object,但是只是一个普通的Object" << std::endl;
}
};
class ObjectEx : public AbstractObject {
virtual ~ObjectEx() {}
virtual void gao() {
std::cout << "虽然叫做ObjectEx好像很厉害的样子,其实还是一个普通的Object" << std::endl;
}
}; class AbstractFactory {
public:
virtual AbstractProduct* CreateProduct() = ;
virtual AbstractObject* CreateObject() = ;
virtual ~AbstractFactory() {}
protected:
AbstractFactory(){}
AbstractFactory(const AbstractFactory&);
AbstractFactory& operator=(const AbstractFactory&);
}; class ConcreteFactory : public AbstractFactory {
public:
virtual AbstractProduct* CreateProduct() {
return new Product();
}
virtual AbstractObject* CreateObject() {
return new Object();
}
static ConcreteFactory* Instance() {
static ConcreteFactory _instance;
return &_instance;
}
}; class ExtraFactory : public AbstractFactory {
public:
virtual AbstractProduct* CreateProduct() {
return new ProductEx();
}
virtual AbstractObject* CreateObject() {
return new ObjectEx();
}
static ExtraFactory* Instance() {
static ExtraFactory _instance;
return &_instance;
}
};

测试代码

 #include <iostream>
#include "Abstract_Factory.h" using namespace std; int main()
{
auto fac = ConcreteFactory::Instance();
auto pro = fac->CreateProduct();
auto obj = fac->CreateObject();
pro->message();
obj->gao(); auto facEx = ExtraFactory::Instance();
auto proEx = facEx->CreateProduct();
auto objEx = facEx->CreateObject();
proEx->message();
objEx->gao(); system("pause");
}

测试结果

 我是一个普通的Product
虽然叫做Object,但是只是一个普通的Object
我是加强后的Product
虽然叫做ObjectEx好像很厉害的样子,其实还是一个普通的Object
请按任意键继续. . .

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. 2.设计模式-Abstract Factory 抽象工厂模式

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

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

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

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

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

随机推荐

  1. 怎么样删除eclipse已经记录svn的地址

    eclipse-->window-->show view-->svn选项卡中选中要删除的svn链接,点击右键废弃即可. 1.

  2. android使用webview上传文件(支持相册和拍照)

    老夫最近需要做一个项目,需要调用服务器段的一些网页来选择文件,刚开始还挺纠结的,不知从何下手,网上大致预览了大神们走过的路,他们传统的方式都是使用一下代码: public void openFileC ...

  3. Deep Learning论文笔记之(八)Deep Learning最新综述

    Deep Learning论文笔记之(八)Deep Learning最新综述 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文,但老感觉看完 ...

  4. Android学习笔记12:图像渲染(Shader)

    在Android中,提供了Shader类专门用来渲染图像以及一些几何图形. Shader类包括了5个直接子类,分别为:BitmapShader.ComposeShader.LinearGradient ...

  5. 一台机器上运行多个ActiveMq

    由于业务需要一台机器上运行多个ActiveMq,这里主要说一下有什么地方不重复: 1.brokerName名称不能重复 2.端口号不能重复uri = tcp://localhost:50509 3.k ...

  6. index 辨别字符在字符串中的位置

    namespace index{    class Program    {        static void Main(string[] args)        {            wh ...

  7. WordPress 'is_serialized()'远程任意代码执行漏洞(CVE-2013-4338)

    漏洞版本: WordPress 3.6 漏洞描述: Bugtraq ID:62345 CVE ID:CVE-2013-4338 WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PH ...

  8. STM32F0308开发环境的选择--CooCox CoIDE篇

    STM32的开发环境有很多总,官方手册也提供了IAR Embedded Workbench.MDK-ARM和TrueSTUDIO这3种.今天我试用了CooCox CoIDE,是免费的集成开发环境,同T ...

  9. 解决Ubuntu下sublime3无法输入中文

    参考site: https://github.com/YoungZHU/sublime-imfix 1. 下载sublime-imfix.c  假设下载到了 home(-)目录下 2. 安装c\C++ ...

  10. php 正则校验是否是域名

    /** * @description 匹配 * t.cn 正确 * t-.cn 错误 * tt.cn正确 * -t.cn 错误 * t-t.cn 正确 * tst-test-tst.cn 正确 * t ...