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

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

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

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

抽象工厂模式的优缺点:

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

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

如果有多个可能的产品系列,具体工厂也可以使用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. C++实现一个限制对象实例个数的类

    http://www.cnblogs.com/absolute8511/archive/2009/03/02/1649603.html

  2. [置顶] 【Git入门之一】Git是神马?

    1.Git是神马? 一个开源的分布式版本控制系统,可以有效的高速的控制管理各种从小到大的项目版本.他的作者就是大名鼎鼎的Linux系统创始人Linus. 2.分布式又是神马? 先看看集中式.简单说来, ...

  3. eval

    字符串形式:表达式计算 Vsftp:/root/perl/14# cat aa 9 5 1 2 Vsftp:/root/perl/14# cat a1.pl open (A,aa); while ($ ...

  4. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  5. Linux 日常使用指令大全

    001.日常维护常用查询命令 #top    显示系统进程 #clear  清理屏幕信息 #cat /etc/redhat-release  查看系统版本信息 #cat /proc/version   ...

  6. [LeetCode#277] Find the Celebrity

    Problem: Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there ma ...

  7. javascript时间、随机数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 利用if else判断几点是什么时间段

    static void Main(string[] args)        {            while (true)            {                int a;  ...

  9. 利用switch case 来运行咱们结婚吧

    static void Main(string[] args)        {            while (true)            {                int x, ...

  10. 【Android 开源】:最火的Android开源项目 第01期

    GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要.利用这些项目,有时能够让你 ...