工厂模式

工厂模式一般分为三种:

  • 简单工厂(Simple Factory)模式
  • 工厂方法(Factory Method)模式
  • 抽象工厂(Abstract Factory)模式

其中简单工厂与工厂方法在GoF中统称为工厂模式。由于所有创建型模式都的基本要求就是为对象的创建提供接口,封装对象的生成。所以简单工厂不专门作为一种创建型模式。但是简单工厂作为创建型模式的基本要求,虽然简单,也值得我们学习一番。

简单工厂(Simple Factory)模式

上面提到,简单工厂提供了创建型模式的基本功能,完成对对象创建的封装。其使用场景主要在当Product的种类太多导致类型名混乱时,使用对Factory传入参数的不同来区分不同种类的Product。注意: 以上所说的种类是指所有Product类均派生自同一基类,否则无法用参数将其区别开来。(参数就是它们属于同一基类的体现)

举个栗子:某车厂现生产多种品牌的车BWM 和 NIO等. 我们将其基本的功能属性抽象出父类Car,通过一个函数CreateCar的传入参数不同,确认生成的是那个子类的具体实例,返回基类指针. 这样我们就可以将对象的生成参数化,控制相同基类的子类对象的生成.

//car.hpp

#include <iostream>#ifndef _DESIGN_PATTERN_SIMPLE_FACTORY_CAR_HPP_
#define _DESIGN_PATTERN_SIMPLE_FACTORY_CAR_HPP_namespace design_pattern
{class Car
{public:virtual void name() = 0;
};class BMW : public Car
{public:void name(){std::cout << "my name is BMW" << std::endl;}
};class NIO : public Car
{public:void name(){std::cout << "my name is NIO" << std::endl;}
};
}#endif //_DESIGN_PATTERN_SIMPLE_FACTORY_CAR_HPP_

//factory_car.hpp

#include "car.hpp"
#include <string>#ifndef _DESIGN_PATTERN_SIMPLE_FACTORY_FACTORYCAR_HPP_
#define _DESIGN_PATTERN_SIMPLE_FACTORY_FACTORYCAR_HPP_namespace design_pattern
{class FactoryCar
{public:Car * CreateCar(std::string const &name){if (name == std::string("BMW"))return new BMW;if (name == std::string("NIO"))return new NIO;return NULL;}
};
}#endif //_DESIGN_PATTERN_SIMPLE_FACTORY_FACTORYCAR_HPP_

//simple_factory_main.cpp

#include "car.hpp"
#include "factory_car.hpp"
using namespace design_pattern;int main()
{FactoryCar fac;Car *pbmw = fac.CreateCar("BMW");Car *pnio = fac.CreateCar("NIO");pbmw->name();pnio->name();return 0;
}

显然,BMW与NIO都是由Car派生而来,在CreateCar函数中,由于其都对string name参数感兴趣才在创建时区分出了BMW与NIO。这就造成,当类进行扩展时,就要去修改CreateCar函数。也就是,若共工厂产品出现变化,NIO停产或者加入新的类型的车,这时我们需要将之前的CreateCar方法修改,造成对原有代码的入侵.不符合开放封闭原则

工厂方法(Factory Method)模式

由于产品体系过于庞大,产品体系出现分层现象。我们之前的简单工厂只能在同一层内区别产品的不同。当产品出现产品树时,我们的工厂模式也进一步以树形进行分层抽象完成在叶子节点的创建,在中间节点的使用的功能。工厂方法模式也就此形成。

注意: 虽然工厂方法模式完成了产品的分层抽象及创建,但其依然局限于同类产品,所有产品必须拥有一个共同的基类。

假设,在FactoryCar中,我们并不知道它们可以通过name区分开来,因为这个类太过笼统。但我们知道在FactoryCar的子类中,随着工厂的逐步细化,在其子类FactoryBMW与FactoryNIO中我们就可以知道其创建的具体对象。

//car.hpp 与simple_factory中一致

//factory_car_series.hpp

#include "car.hpp"
#ifndef _DESIGN_PATTERN_FACTORY_METHOD_FACTORY_CAR_SERIES_HPP_
#define _DESIGN_PATTERN_FACTORY_METHOD_FACTORY_CAR_SERIES_HPP_namespace design_pattern
{class FactoryCarBase
{public:virtual Car * CreateCar() = 0;
};class FactoryBMW : public FactoryCarBase
{public:Car * CreateCar(){return new BMW;}
};class FactoryNIO : public FactoryCarBase
{public:Car * CreateCar(){return new NIO;}
};}#endif //_DESIGN_PATTERN_FACTORY_METHOD_FACTORY_CAR_SERIES_HPP_

//factory_method_main.cpp

#include "car.hpp"
#include "factory_car_series.hpp"
using namespace design_pattern;int main()
{FactoryBMW fbmw;FactoryCarBase *pfac_base = &fbmw;Car *bmw = pfac_base->CreateCar();bmw->name();FactoryNIO fnio;pfac_base = &fnio;Car *nio = pfac_base->CreateCar();nio->name();return 0;
}

显然,在父类FactoryCarBase中,我们并不知道创建那种Car,只有在其子类中我们才知道具体创建的种类。

当然,如果我们嫌FactoryCarBase通过继承方式太过浪费,那也可以采用之前的参数化工厂方法实现。

语法tips

  • 相同namesapce中,无需再声明using即可使用。
  • 编译器为一个类默认提供缺省成员函数均为public. example: class Test
    1. Test()
      //constructor
    2. ~Test()
      //destructor
    3. Test(Test const&)
      //copy constructor
    4. Test const& operator=(Test const&)
      //assignment operator reload
    5. Test* operator&()
      //address-of operator reload
    6. Test const* operator()const
      //const address-of operator reload

工厂(Factory)模式相关推荐

  1. 设计模式学习笔记——工厂(Factory)模式

    设计模式学习笔记--工厂(Factory)模式 @(设计模式)[设计模式, 工厂模式, factory] 设计模式学习笔记工厂Factory模式 基本介绍 工厂案例 类图 实现代码 framework ...

  2. C++之工厂(factory)模式

    0. 简介 继单例模式写完后,我觉得对于C++的高级用法可以来开一个专栏来专门整理与阐述,这里,我将以我们最常用的工厂模式开始,来逐步的共同学习. 1. 初级工厂模式 工厂顾名思义就是创建产品,根据产 ...

  3. 设计模式--简单工厂(Factory)模式

    温故而知新,看了以前写的博文<Asp.net读取Excel文件 2>http://www.cnblogs.com/insus/archive/2011/05/05/2037808.html ...

  4. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  5. 设计模式(2)工厂方法模式(Factory Method)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 源码地址 0 工厂方法模式简介 0.0 工厂方法模式定义 工厂方法模式是在简单工厂模式基础上,为解决更复杂的对象创建问题而衍生 ...

  6. 《转》java设计模式--工厂方法模式(Factory Method)

    本文转自:http://www.cnblogs.com/archimedes/p/java-factory-method-pattern.html 工厂方法模式(别名:虚拟构造) 定义一个用于创建对象 ...

  7. 工厂方法模式(Factory Method)

    简单工厂(静态工厂方法) 简单工厂实际上不算一种模式,可以把它叫做一种常用写法.例如我们常用的数据库操作,为了适配不同的数据库引擎,可能分别编写了具体的数据库操作类(当然这些类都实现了统一的接口): ...

  8. 进阶学习(3.2)Factory Method Pattern 工厂方法模式

    1  类的实例化不在工厂接口里面实例化, 而是在工厂子类里面实例化 2  使用者无需关注子类工厂里面的逻辑是怎么写的, 只需要知道我调用的这个方法能实 现什么功能, 我不管具体实现 3  需要添加新功 ...

  9. 设计模式--抽象工厂(Abstract Factory)模式

    模式定义 提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类 类图 应用场景 程序需要处理不同系列的相关产品,但是你不希望它依赖于这些产品的具体类时可以使用抽象工厂模式 优点 1.可以 ...

最新文章

  1. C 的异常捕捉实现
  2. CF359D:Pair of Numbers(数论)
  3. 浅析机器视觉在安防行业的应用
  4. JAVA 双重检查锁定和延迟初始化
  5. FineReport——JS二次开发(局部刷新)
  6. 如何持之以恒做好一件事?
  7. 编写高质量JS代码上
  8. [转]6个开源数据科学项目
  9. 域控查看ldap端口命令_LDAP基础安装与简单入门使用
  10. linux xp双系统引导修复工具,XP和ubuntu双系统下如何修复XP引导菜单
  11. java软件制作教程_Minecraft Java版材质包制作教程
  12. Markdown个人简历模板
  13. 【交易架构day4】京东到家交易系统的演进之路
  14. 如何将一段视频做成动图?分享一款视频转gif工具
  15. OneTab: 一键合并所有 Chrome 浏览器标签页
  16. JavaScript知识点整理(十三)- DOM -(2)操作元素
  17. 统计素数并求和 / 求奇数和
  18. EMD——EEMD——CEEMD
  19. jmeter查看平均响应时间_线上服务平均响应时间太长,怎么排查?
  20. ICLR 2021|基于GAN的二维图像无监督三维形状重建

热门文章

  1. 2019年的夏天,和CDEC生态大会在成都耍一哈儿
  2. 百业升级 共启新程——CDEC2021中国数字智能生态大会武汉站今日举行
  3. 两篇励志的文章[转]
  4. spotify电脑下载歌曲_Spotify开源Klio, 音频处理从业者的福音来了
  5. phpstudy启动MySQL服务遇到的问题及解决过程
  6. 香港银行开户过程需要注意些什么
  7. 你是否愿意为他人撑起一把伞?
  8. 国内那么多AI专业,为什么国内却没有ChatGPT?
  9. Vuforia 虚拟按钮(Unity 2020)
  10. vuex的使用说明(个人专用)