工厂方法C++实现

1描述

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类

2类图描述

3代码实现:

class Product

{

protected:

  Product();

public:

virtural ~Product() = 0;

};

class ConcreteProduct: public Product

{};

class Creator

{

protected:

Creator();

public:

  //核心接口所在,该方法定义产品生成

virtual Product*FactoryMethod() =  0;

  virtual ~Creator() = 0;

};

class ConcreteCreator:public Creator

{

public:

 Product * CreatProduct()

{

retun new ConcreteProduct();

}

};

4 问题

在2中实现的工厂方法中,因为具体的工厂生产Product都是特定在Create函数中实现的。所以当ConcreteProduct 类型增多时,可能就需要决策具体实例化哪个Product了

那么,

解决方案可以是

①给CreateProduct增加参数进行决策;

Product *ConcreteCreator::CreatProduct(int index)

{

  switch(index)

  {

    case 1:

      return ConcreteProduct1();

    break;

    case 2:

      return ConcreteProduct2();

    break;

  }

}

②利用模板方法,由用户需求决定具体的实例化对象类型。

template<class T>

Product *ConcreteCreator<T>::CreatProduct()

{

  return T();

}

5工厂方法应用

①优点:

良好封装,创建产品只需要知道类型就好,具体创建由工厂返回

扩展性强,当产品类型增多,代码整体结构并没有太大变化。“拥抱变化”

屏蔽产品类,调用者只需要知道产品接口就好

典型的解耦框架。高层只需要知道产品的抽象类,符合迪米特法则,依赖倒置原则,里氏替换原则

6 使用场景

①他是new产品的一个替代品

②需要灵活地,可扩展的框架是,考虑工厂模式

③在异构项目中,可以通过工厂模式实现系统同构化,只需要关进具体的接口接合问题

④在测试驱动开发的框架中。可以通过工厂方法将具体测试者所依赖的其他类虚拟出来,从而避免耦合

7扩展

① 缩小为简单工厂模式

方案:

工厂模式:有不同的工厂车间继承自抽象工厂基类,为生产不同产品而运行。或者如上通过参数传递确定生产产品类型

简单工厂:只生产一种商品的工厂。

所以这时的工厂就应当是具体的某一个ConcreteFactory,而不用虚拟工厂存在

②升级为多个工厂类

描述:

以上所说由参数或者模板方法确定具体产品类型所指是一个可以生产多种相关产品的工厂了(不同车间生产)

那么要做到单一职责--一个工厂只生产一种特定产品,就应当将车间等级提升为工厂了。这就是多工厂了

实现变动:

//两种产品

class ConcreteProduct1:public Product{};
class ConcreteProduct2:public Product{};

class ConcreteCreator1:public Creator

{

public:

  Product ConcreteProduct1* CreatorProduct()

  {

    return new ConcreteProduct1();

  }

};

class ConcreteCreator2:public Creator

{

public:

  Product ConcreteProduct2* CreatorProduct()

  {

    return new ConcreteProduct2();

  }

};

③替换单例模式

描述:因为单例模式拥有,接口少,扩展性差的缺点,而我们的工厂模式又恰好拥有这个特点。那么将之接合,两全其美

实现:

class Singleton

{

//保证工厂方法可以调用其构造函数进行初始化

  friend class SingletonFactory;

protected:

  Singleton(){}

public:

   void doSomething()

  {//业务处理}

};

class SingletonFactory

{

private:

  //包装单例的指针,外部所得永远为这一个指针。具体的单例确定:RAII(资源获取即初始化)

  static Singleton *_singleton;

public:

  static Singleton* GetSingleton()

  {

    return _singleton;

  }

};

Singleton * SingletonFactory::_singleton = new Singleton();

④延迟初始化/最大连接数问题

问题举例:在系统中,因为资源及CPU限制,往往会有数据库连接数量MAX限制。而连接的数据库类型又可能不一致type1,2,3........。

看到这个,我们可能会想到多例模式。但是这个问题又存在数据库类型不一致问题了。

于是就找到工厂方法了。

实现:

class ProductFactory

{

private:

  static Map<string,product> prMap = new HashMap();//用于已经连接数据库的保存

public:

  static product NewConnection(string type)

  {

    Product pr = NULL;

    if(prMap.hasConnention(type))

    {

      pr = prMap.get(type);

    }

    else

    {

      //确定类型

      switch(type)

      {

      case typePr

        pr = new (typePr);

        prMap.put(typePr);

      }

    }

    return pr;

  }

};

注:以上代码并非可运行的

补充:

工厂模式的伟大,可以和其他模式混合使用:单例,模板方法,原型模式等。

设计模式---工厂方法C++实现的更多相关文章

  1. 4. 星际争霸之php设计模式--工厂方法模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. C++设计模式——工厂方法模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...

  3. JAVA设计模式--工厂方法模式

    工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关 ...

  4. 深入浅出设计模式——工厂方法模式(Factory Method)

    介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...

  5. C#设计模式——工厂方法

    一.为什么需要工厂方法      工厂方法可以这么理解.你规定了一个规范,只要符合这个规范.那么就可以按照你的方式进行操作,这样你就无需知道具体操作的对象是什么,具有什么特性等等,可以进行统一化的操作 ...

  6. 设计模式-工厂方法(Demo)

    工厂方法 工厂方法跟简单工厂一样.都是创建型的设计模式.他攻克了简单工厂的违背开放封闭的缺点. 故事 主人--人家做饭好累的.女仆抱着我大腿说着.自从上次把她买进家.没做了几次饭就喊累--看着她那出处 ...

  7. 设计模式--工厂方法模式(Factory method pattern)及应用

    面向对象的好处: 通过封装,继承,多态把程序的耦合度降低. 用设计模式可以使程序更加灵活,容易修改,且易于复用. 1. 工厂方法模式 Define an interface for creating ...

  8. 我的Java设计模式-工厂方法模式

    女朋友dodo闹脾气,气势汹汹的说"我要吃雪糕".笔者心里啊乐滋滋的,一支雪糕就能哄回来,不亦乐乎?! 但是,雪糕买回来了,她竟然说"不想吃雪糕了,突然想吃披萨" ...

  9. [C#]设计模式-工厂方法-创建型模式

    介绍完简单工厂之后,现在就来介绍一下工厂方法模式.之前简单工厂有一个弊端就是每次你需要产生新的产品的时候都需要对创建工厂类进行更改,如同前一篇文章说过的一样最后的后果是工厂类会变得十分庞大. 而工厂方 ...

  10. 设计模式 — 工厂方法模式(Factory Method)

    在开发系统中,经常会碰到一个问题.现在需要实现的一些功能,但是这个功能模块以后一定是需要扩展的,那么现在开发中就不仅要实现现在的功能,还要考虑以后的扩展.那么为了系统的健壮,扩展就要遵循开闭原则(简单 ...

随机推荐

  1. JVM类加载器工作流程

    类加载器 classloader:谈到类加载,不得不提的就是负责此项工作的类加载器classloader,classloader的职责是将Java源文件编译后的字节码文件加载到内存中去执行. 类加载至 ...

  2. [golang note] 流程控制

    流程控制 • 流程控制语句作用 ▪ 选择:根据条件跳转到不同的执行序列. ▪ 循环:根据条件反复执行某个序列. ▪ 跳转:据条件返回到某执行序列. • 流程控制语句类型 ▪ 条件语句:关键字为if.e ...

  3. adb push ,adb pull和adb install的区别

    1.用命令行把手机上的文件拷贝到电脑上 1 adb pull sdcard/1222073679.png 拷贝文件夹命令,如把log文件夹拷贝到电脑当前目录 1 adb pull sdcard/log ...

  4. 下载.iso类型的软件如何安装

    法一:这种类型的文件为镜像文件,一般默认在虚拟光驱上运行.通常的做法为: 安装Daemon Tools 虚拟光驱,可以打开CUE.ISO.CCD等这些虚拟光驱的镜像文件,并且将文件虚拟到光盘上使用.运 ...

  5. Java设计原则—里氏替换原则(转)

    里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题. 继承的优点: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性: 提高代码的重用性: 子类 ...

  6. iClap专访:颠覆传统办公方式,规范化产品管理系统

    背景:DevStore是成立于2014年的移动互联网企业运营解决方案整合平台,线上资源涉及产品研发,设计,推广运维各个阶段,致力于为互联网从业者提供帮助.iClap是DevStore的全新产品,于20 ...

  7. curl 命令返回json结构human readable

    在curl命令后面添加 | python -m json.tool 不想显示curl的统计信息,添加 -s参数 例: curl https://news-at.zhihu.com/api/4/news ...

  8. EXTJS 下载

    Extjs各版本的下载链接 Extjs的版本繁多,本文收集了Extjs各个版本的下载链接,包括官网和非官网的,以及各种汉化版api,欢迎大家下载分享. Extjs最新版下载链接:http://www. ...

  9. Decker容器使用

    Docker 客户端 我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项 root@ranxf:/home/ranxf# docker Usage: docker COM ...

  10. Redis学习笔记之Redis中5种数据结构的使用场景介绍

    原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构 ...