工厂方法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. APICloud常用方式

    新打开一个窗口: api.openWin({ name: 'unlogin', url: 'widget://html/unlogin.html', pageParam: { } }); 新打开一个F ...

  2. python 之操作redis数据库(非关系型数据库,k-v)

    数据库: 1. 关系型数据库 表结构 2. 非关系型数据库 nosql (k - v 速度快),常用的时以下三种: memcache 存在内存里 redis 存在内存里 mangodb 数据还是存在磁 ...

  3. SHUOJ Arithmetic Sequence (FFT)

    链接:http://acmoj.shu.edu.cn/problem/533/ 题意:求一个序列中,有多少三元组(其中元素不重复)在任意的排列下能构成等差数列. 分析:等差数列:\(A_j-A_i=A ...

  4. Ubuntu14.04+caffe+cuda7.5 环境搭建以及MNIST数据集的训练与测试

    Ubuntu14.04+caffe+cuda 环境搭建以及MNIST数据集的训练与测试 一.ubuntu14.04的安装: ubuntu的安装是一件十分简单的事情,这里给出一个参考教程: http:/ ...

  5. eclipse中Web Deployment Assembly与build path作用

    java Build path是编译路径设置,主要用来设置源代码的编译路径默认是default output folder Web Deployment Assembly是eclipse中的发布路径设 ...

  6. try cath

    用try cath 的缺点? 举例: 一个程序 有3层.基类层,中间层,和  使用层. 在 基类层 使用 try cath 如果发生 异常,将会 一层一层 冒泡到 使用层 并弹出报错信息:效率 大大降 ...

  7. opencv图像处理之在手机上实现背景虚化

    http://m.blog.csdn.net/blogercn/article/details/75004162 1.高端数码相机都具有背景虚化功能.背景虚化就是使景深变浅,使焦点聚集在主题上.一般的 ...

  8. 【Thinking in Java, 4e】控制流程执行

    p46~p75: [迭代] 1.Java不允许将数字作为布尔值用. 1.有点意思的小程序WhileTest. public class WhileTest { static boolean condi ...

  9. Python面试题之Python中type和object的关系

    知乎上看到的提问: 两个是互为实例的关系,但不是互为子类的关系,只有type是object的子类,反之则不成立. 大牛说两者是蛋生鸡鸡生蛋的关系,但我还是不明白,有懂的麻烦解释一下, 希望不要给出外文 ...

  10. Kafka学习之(一)了解一下Kafka及关键概念和处理机制

    Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模小打的网站中所有动作流数据.优势 高吞吐量:非常普通的硬件Kafka也可以支持每秒100W的消息,即使在非常廉价的商用机器上也能做 ...