设计模式---工厂方法C++实现
工厂方法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++实现的更多相关文章
- 4. 星际争霸之php设计模式--工厂方法模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——工厂方法模式
本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...
- JAVA设计模式--工厂方法模式
工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关 ...
- 深入浅出设计模式——工厂方法模式(Factory Method)
介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...
- C#设计模式——工厂方法
一.为什么需要工厂方法 工厂方法可以这么理解.你规定了一个规范,只要符合这个规范.那么就可以按照你的方式进行操作,这样你就无需知道具体操作的对象是什么,具有什么特性等等,可以进行统一化的操作 ...
- 设计模式-工厂方法(Demo)
工厂方法 工厂方法跟简单工厂一样.都是创建型的设计模式.他攻克了简单工厂的违背开放封闭的缺点. 故事 主人--人家做饭好累的.女仆抱着我大腿说着.自从上次把她买进家.没做了几次饭就喊累--看着她那出处 ...
- 设计模式--工厂方法模式(Factory method pattern)及应用
面向对象的好处: 通过封装,继承,多态把程序的耦合度降低. 用设计模式可以使程序更加灵活,容易修改,且易于复用. 1. 工厂方法模式 Define an interface for creating ...
- 我的Java设计模式-工厂方法模式
女朋友dodo闹脾气,气势汹汹的说"我要吃雪糕".笔者心里啊乐滋滋的,一支雪糕就能哄回来,不亦乐乎?! 但是,雪糕买回来了,她竟然说"不想吃雪糕了,突然想吃披萨" ...
- [C#]设计模式-工厂方法-创建型模式
介绍完简单工厂之后,现在就来介绍一下工厂方法模式.之前简单工厂有一个弊端就是每次你需要产生新的产品的时候都需要对创建工厂类进行更改,如同前一篇文章说过的一样最后的后果是工厂类会变得十分庞大. 而工厂方 ...
- 设计模式 — 工厂方法模式(Factory Method)
在开发系统中,经常会碰到一个问题.现在需要实现的一些功能,但是这个功能模块以后一定是需要扩展的,那么现在开发中就不仅要实现现在的功能,还要考虑以后的扩展.那么为了系统的健壮,扩展就要遵循开闭原则(简单 ...
随机推荐
- 关于Windows Service的一个编写技巧
写过Windows Service的朋友都知道服务是不可以直接在vs里面启动调试,我们必须修改Program.cs文件来达到我们调试的目的,等服务调试好了以后还要把代码改回来,显非常的不方便,在这里为 ...
- css图片上悬浮文字(丝带效果)实现
首先看效果 思路:1.去掉“丝带“菱角使用的是overflow: hidden; 2.通过z-index降低图片的优先级或者调高“丝带”优先级来实现覆盖效果(z-index需要写在有position的 ...
- Deep learning与Neural Network
深度学习是机器学习研究中的一个新的领域,其动机在于建立.模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本.深度学习是无监督学习的一种. 深度学习的概念源于人工神经网络的 ...
- centos6.8安装zabbix
前后用了两台电脑来实验,前后画风不一样,请忽略 一.安装php环境 移除目前系统安装的 PHP 组件 yum remove php* -y 安装 PHP 的 YUM 源 rpm -Uvh http: ...
- IISExpress 站点信息
目录:C:\Users\huxl16\Documents\IISExpress\config applicationhost:applicationhost.config
- Java程序运行在Docker等容器环境有哪些新问题
基本回答 一. 对于Java来说,Docker毕竟是一个较新的环境,其内存.CPU等资源限制是通过ControlGroup实现的.早期的JDK版本并不能识别这些限制,进而会导致一些基础问题. 1.如 ...
- java字符串分割的小练习
最近看到一个网友的一个小问题,有关字符串分割的,思考了一下,后面给出代码:碰到一个java字符串判断结尾的问题,发现与c\c++以"\0"判断字符串结尾不同的是,java中字符串是 ...
- 漂亮的输出-----prettytable和colorama的使用
Python通过prettytable模块将输出内容如表格方式整齐输出,python本身并不内置,需要独立安装该第三方库. 1 pip install PrettyTable 1 #源码安装 2 wg ...
- Oracle中用sql语句取随机数和整数
--- 应用round(5.678,3)保留小数 应用floor(5.678)保留整数 应用dbms_random.value(30,50)取得随机数 --- dbms_random包 获得随机小数S ...
- dependency的scope
scope作用域,一共有三种作用域:compile(编译).runtime(运行).test(测试) 备注:打包必经compile阶段 1.test 测试 2.compile 编译 打 ...