简单工厂模式,又称为静态工厂方法模式(staticfactory method),除了单件模式之外,大约是23种Gof归纳的常见模式之中最简单的一种了。简单的讲,它就是用工厂类的一个静态方法来创建对象。这样,我们可以做到利用工厂类的静态方法统一管理对象的创建。

静态方法根据传入的字符串参数决定创建哪一个具体的对象,这样,客户端只需要知需要告诉工厂,它需要什么对象,工厂就会根据客户端的指令创建相应的对象实例,实现了客户端和对象创建的分离,解开了两者之间的耦合。

静态工厂推迟了对象的实例化。因为静态工厂是根据传入的字符串决定对象的实例化,所以我们可以通过配置文件决定工厂所创建的具体对象,这样我们可以通过配置文件修改代码的行为而无需对代码进行重新编译。

我们还是来看一个实际的例子。比如我们要创建一批音乐盒,包括可以播放小提琴音乐的音乐盒和播放钢琴音乐的音乐盒。使用简单工厂模式,我们可以将这个创建过程实现如下:

#include "stdafx.h"
#include <string>
#include <iostream>
#include <memory>
using namespace std;
// 抽象的产品类
class IMusicBox
{
public:virtual void playMusic() = 0;
};
// 具体的产品
class ViolinBox : public IMusicBox
{
public:void playMusic(){cout<<"播放小提琴音乐";}
};
class PianoBox : public IMusicBox
{
public:void playMusic(){cout<<"播放钢琴音乐";}
};
// 工厂类
class MusicBoxFactory
{
public:// 工厂类的静态方法// 这个方法根据传入的字符串参数返回创建的对象static IMusicBox* createMusicBox(string strName){IMusicBox* pBox = NULL;if("Violin" == strName){return new ViolinBox();}else if( "Piano" == strName){ return new PianoBox();}else{return nullptr;}}
};
int _tmain(int argc, _TCHAR* argv[])
{// 创建对象shared_ptr pBox( MusicBoxFactory::createMusicBox("Violin"));pBox->playMusic();// 利用工厂创建新的对象pBox.reset(MusicBoxFactory::createMusicBox("Piano"));pBox->playMusic();return 0;
}

从这里我们也可以看到,简单工厂模式的实现也非常简单,首先创建一个抽象的产品类,这里的IMusicBox,工厂方法需要利用这个抽象类来代表它所创建的产品,而不用管到底是什么产品。然后分贝实现具体的产品,ViolinBox和PianoBox,也就是我们具体要创建的对象。最后创建一个工厂类MusicBoxFactory并实现一个静态的函数,这个函数接受一个字符串作为参数,这个字符串就是客户端的指令,这个函数将根据这个字符串创建具体的产品。

这样,客户端只需要告诉简单工厂,它需要什么对象,就能够从工厂获得这个对象实例。对象的创建工作,都由简单工厂来完成了。

当然,简单工厂也还是有一定的局限,比如,它使用简单的实符串比较来决定要创建的对象,当工厂负责创建的对象增多时,将是一个很麻烦的事情。Gof后面总结的抽象工厂和工厂方法都是对简单工厂模式的某种形式上的升级,弥补了简单工厂的某些缺点。将这三个模式对比起来学习,将更加有助于我们更好的理解这三个创建型模式。

设计模式之工厂方法模式(Factory Method)相关推荐

  1. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

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

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

  3. 设计模式之工厂方法模式---factory method

    模式的介绍 模式的定义 Define an interface for creating an object,but let subclassed decide which class to inst ...

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

    一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...

  5. 设计模式题目-工厂方法模式(Factory Method)

    设计一个程序来读取多种不同存储格式的图片,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF格式图片读取器(GifReader)用于读取GIF格式的图片,JPEG格式图片读取器 ...

  6. 工厂方法模式(Factory Method)简介

    工厂方法模式 名字 跟已经介绍的 简单工厂模式很类似. 实际上它们的模型也是十分相似的. 我们先看看工厂模式的定义. 一. 工厂方法(Factory Method)模式定义 教材上是这样写的: 工厂方 ...

  7. 设计模式之六:工厂方法模式(Factory method Pattern)

    工厂方法(Factory Method)模式就是定义一个创建对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责具体产品的创建,仅提供了具体工厂子类必须实现的接口,这样核心类成为一个抽象 ...

  8. 浅谈C++设计模式之工厂方法(Factory Method)

    为什么要用设计模式?根本原因是为了代码复用,增加可维护性. 面向对象设计坚持的原则:开闭原则(Open Closed Principle,OCP).里氏代换原则(Liskov Substitution ...

  9. 软件工程 - 设计模式学习之工厂方法模式Factory Method

    在现实生活中我们可以看见,乐事在卖薯片,可比克也在卖. 我敢肯定的说它们各自都有自己的工厂来生产薯片,而且生产出来的薯片味道还是不一样的. 这就是我们这里所谓的工厂方法模式. 我们来看看这个模式的UM ...

  10. C++实现工厂方法模式Factory Method Pattern

    设计原则6:要依赖抽象,不要依赖具体类.(又称依赖倒置原则Dependency Inversion Principle) 不能让高层组件依赖低层组件,而且,不管高层组件或低层组件,两者都应该依赖于抽象 ...

最新文章

  1. 为反对种族歧视,GitHub正在把master/slave等术语替换掉
  2. 【渗透测试】一次运气很好的文件上传
  3. 【Python】猜数小游戏(文件操作)
  4. jzoj3896-战争游戏【tarjan,割点,点双联通分量】
  5. nano-pc-t1 4412 显示驱动分析
  6. 韩国冬奥:未来科技奥运我要长这样,阿里巴巴:你尽管想
  7. Visual Studio 2017 15.5 正式发布,性能再提升
  8. 阿里云云计算 38 PolarDB MySQL的数据管理
  9. android简单小游戏开发工具,傻瓜化开发Android小游戏
  10. 【April Fools Day Contest 2014F】【愚人节脑洞 OEIS大法】000001 输出序列某一项
  11. 正点原子STM32串口通讯实验详解
  12. 每个英文名字背后的寓意,你也来起一个吧
  13. python求小于n的最大素数_枚举1--求小于n的最大素数
  14. 利用 DIAMOND、MCScanX、TBtools 分析物种基因组间的共线性区段与基因复制事件
  15. Channel 是什么?
  16. vbnet加载ocx控件不能生成窗体_解决VB6.0中不能加载MSCOMCTL.OCX的错误提示
  17. 高手如何做全网整合营销推广?全网营销方法和策略有哪些?
  18. 许一世情 陪你 浪尽天涯
  19. 计算机从图灵到冯诺依曼,电脑是谁发明的 冯·诺依曼和图灵(两人都起到了重要作用)...
  20. 投稿前,如何查询期刊投稿周期,4种亲测有效实用方法

热门文章

  1. 上班划水神器:一个可以在控制台玩斗地主项目!
  2. 无胁科技-TVD每日漏洞情报-2022-9-29
  3. linux下,批量复制文件名带空格的文件
  4. IOS Safari浏览器添加桌面图标
  5. CentOS 之 python-devel 安装
  6. box-shadow 93种经典效果
  7. 9个主流的开源许可协议
  8. 手机音视频流媒体开发一些有用资料CVideoPlayerUtility
  9. 「LSTM 之父」亲笔万字长文,只为向世人证明:深度学习不是在母语为英语的地方被发明的
  10. scala读取mysql_转: spark:scala读取mysql的4种方法