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

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

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

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

抽象工厂模式的优缺点:

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

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

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

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

  1. #include <iostream>
  2. #include <string>
  3.  
  4. class AbstractProduct {
  5. public:
  6. virtual ~AbstractProduct() {}
  7. virtual void message() = ;
  8. };
  9. class Product : public AbstractProduct {
  10. virtual ~Product() {}
  11. virtual void message() {
  12. std::cout << "我是一个普通的Product" << std::endl;
  13. }
  14. };
  15. class ProductEx : public AbstractProduct {
  16. virtual ~ProductEx() {}
  17. virtual void message() {
  18. std::cout << "我是加强后的Product" << std::endl;
  19. }
  20. };
  21.  
  22. class AbstractObject {
  23. public:
  24. virtual ~AbstractObject() {}
  25. virtual void gao() = ;
  26. };
  27. class Object : public AbstractObject {
  28. virtual ~Object() {}
  29. virtual void gao() {
  30. std::cout << "虽然叫做Object,但是只是一个普通的Object" << std::endl;
  31. }
  32. };
  33. class ObjectEx : public AbstractObject {
  34. virtual ~ObjectEx() {}
  35. virtual void gao() {
  36. std::cout << "虽然叫做ObjectEx好像很厉害的样子,其实还是一个普通的Object" << std::endl;
  37. }
  38. };
  39.  
  40. class AbstractFactory {
  41. public:
  42. virtual AbstractProduct* CreateProduct() = ;
  43. virtual AbstractObject* CreateObject() = ;
  44. virtual ~AbstractFactory() {}
  45. protected:
  46. AbstractFactory(){}
  47. AbstractFactory(const AbstractFactory&);
  48. AbstractFactory& operator=(const AbstractFactory&);
  49. };
  50.  
  51. class ConcreteFactory : public AbstractFactory {
  52. public:
  53. virtual AbstractProduct* CreateProduct() {
  54. return new Product();
  55. }
  56. virtual AbstractObject* CreateObject() {
  57. return new Object();
  58. }
  59. static ConcreteFactory* Instance() {
  60. static ConcreteFactory _instance;
  61. return &_instance;
  62. }
  63. };
  64.  
  65. class ExtraFactory : public AbstractFactory {
  66. public:
  67. virtual AbstractProduct* CreateProduct() {
  68. return new ProductEx();
  69. }
  70. virtual AbstractObject* CreateObject() {
  71. return new ObjectEx();
  72. }
  73. static ExtraFactory* Instance() {
  74. static ExtraFactory _instance;
  75. return &_instance;
  76. }
  77. };

测试代码

  1. #include <iostream>
  2. #include "Abstract_Factory.h"
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. auto fac = ConcreteFactory::Instance();
  9. auto pro = fac->CreateProduct();
  10. auto obj = fac->CreateObject();
  11. pro->message();
  12. obj->gao();
  13.  
  14. auto facEx = ExtraFactory::Instance();
  15. auto proEx = facEx->CreateProduct();
  16. auto objEx = facEx->CreateObject();
  17. proEx->message();
  18. objEx->gao();
  19.  
  20. system("pause");
  21. }

测试结果

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

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. Android Studio 打包及引用 aar

    Android Studio 打包及引用 aar 1. 简述 在比较大的 Android 项目的开发中,我们经常会遇到工程.jar 包等等之间相互引用的方式.一般我们通过在 gradle 文件中配置依 ...

  2. ruby hashtable散列表

    dict={'cat'=>'abc','dog'=>'def'}puts dict.size dict.keys返回所有的key, values返回所有的value. 删除: dict.d ...

  3. linux操作Oracle导入导出dmp数据命令

    --清空该表数据 :非索引清空TRUNCATE TABLE  GE_INTERFACE_MESSAGE; --数据库导出 指定导出某个用户的所有数据 包括表 索引 序列 存储过程 函数 等exp CX ...

  4. 转:三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)

    转:http://blog.csdn.net/liujun13579/article/details/7773945 卡片布局能够让多个组件共享同一个显示空间,共享空间的组件之间的关系就像一叠牌,组件 ...

  5. CentOS6.5 x86_64 配置Broadcom 43XX系列 无线网卡驱动

    from: http://wiki.centos.org/HowTos/Laptops/Wireless/Broadcom?action=show In order to install Broadc ...

  6. 【转】Android4.4(MT8685)源码蓝牙解析--BLE搜索

    原文网址:http://blog.csdn.net/u013467735/article/details/41962075 BLE:全称为Bluetooth Low Energy.蓝牙规范4.0最重要 ...

  7. 机器更换登录密码重启,然后SQL Server登录不了

    解决方法:

  8. DATEDIFF()(转)

    SQL DATEDIFF 函数 Leave a reply SQL DATEDIFF() 函数用来返回2个时间的差.这个函数在SQL Server和MySQL中都有,但语法上有不同. SQL CASE ...

  9. Cubieboard编译安装NodeJS经验总结

    Cubieboard编译安装NodeJS经验总结,以供新手免走弯路. Cubieboad用的是arm处理器,NodeJs的编译安装上不像pc上那么简单,可以一遍过. 单单make编译一次,就得几乎一个 ...

  10. C# 4.0 新特性

    http://www.cnblogs.com/webabcd/archive/2010/05/27/1744899.html 在MVC中Controller的action方法 常用的:可选参数和参数默 ...