设计模式---工厂方法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)
在开发系统中,经常会碰到一个问题.现在需要实现的一些功能,但是这个功能模块以后一定是需要扩展的,那么现在开发中就不仅要实现现在的功能,还要考虑以后的扩展.那么为了系统的健壮,扩展就要遵循开闭原则(简单 ...
随机推荐
- TraClus java版实现
前一阵子我们部门接到了业务那边的一个需求.想通过用户的wifi数据计算出商场内用户最喜爱走的线路.其实说白了就是用户轨迹聚类.根据业务的需求,我们最终采用了traClus聚类算法.tra ...
- 闪回事务(Flashback Transaction)
到目前为止,介绍的所有功能均不会直接将数据恢复为“以前”的样子.闪回查询只是查看,闪回数据归档只是延伸了闪回查询的时间窗口,闪回事务查询虽然提供了撤销SQL,但是否执行及如何执行还需要管理员进一步手动 ...
- python全栈开发从入门到放弃之socket并发编程之协程
一.为什么会有协程 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情 ...
- vue指令与组件
参考http://blog.csdn.net/lioldamon/article/details/74058222?utm_source=itdadao&utm_medium=referral ...
- 中高级PHP开发者应该掌握哪些技术?
中级PHP程序员 1.Linux 能够流畅的使用Shell脚本来完成很多自动化的工作:awk/sed/perl 也操作的不错,能够完成很多文本处理和数据统计等工作:基本能够安装大 部分非特殊的Linu ...
- JavaScript 操作JSON总结
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- spring cloud 转
http://blog.csdn.net/forezp/article/details/70148833 服务的注册与发现(Eureka) 服务注册(consul) 服务消费者(rest+ribbon ...
- windows忘记密码
方法一 在开机时,按下F8进入”带命令提示符的安全”模式 输入”NET USER+用户名+123456/ADD”可把某用户的密码强行设置为”123456″ 方法二 如用户忘记登入密码可按下列方法解决 ...
- 20145335郝昊《Java程序设计》课程总结
20145335郝昊<Java程序设计>课程总结 1.读书笔记汇总 第一周学习总结:http://www.cnblogs.com/20145335hh/p/5244638.html 第二周 ...
- MR案例:WordCount改写
请参照wordcount实现一个自己的MapReduce,需求为: a. 输入文件格式: xxx,xxx,xxx,xxx,xxx,xxx,xxx b. 输出文件格式: ...