设计模式---工厂方法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)
在开发系统中,经常会碰到一个问题.现在需要实现的一些功能,但是这个功能模块以后一定是需要扩展的,那么现在开发中就不仅要实现现在的功能,还要考虑以后的扩展.那么为了系统的健壮,扩展就要遵循开闭原则(简单 ...
随机推荐
- 生信-RPKM与FPKM学习[转载]
转自:https://baike.baidu.com/item/RPKM/1197657 均反应基因的表达水平 1.RPKM的计算公式 分母是总共比对到这个基因的reads的数目(条 为单位),分母是 ...
- [笔记]Delphi 2007写DLL供VC调用实例
考虑如下几种常用情况: - VC传入int,返回int- VC传入char *,返回int- VC传入char *,返回char *及int 为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UN ...
- web.xml中配置spring配置(application.xml)文件
application.xml 一般放到WEB-INF下,当然,你也可以将它放到任意问题,但需要web.xml指向到该文件 1.application.xml配置 <?xml version=& ...
- linux_rpm命令
rpm 常用命令 1.安装一个包 # rpm -ivh 文件名 2.升级一个包 # rpm -Uvh文件名 3.移走一个包 # rpm -e文件名 4.安装参数 --force 即使覆盖属于其它包的文 ...
- c++之旅:模板库中的容器
容器 C++中的容器包括array, vector, list,map,set 数组 array不可变长,创建时其大小就固定了,array中可以存储各种数据类型包括对象,不过array是在栈上分配的, ...
- mysql慢查询导致故障
原因: 网站访问很慢,报警php进程数过大 排查及处理:1.首先查看服务器监控和mysql监控,分析服务器是否负载过大,受到攻击,以及mysql性能方面是否正常2.发现只读数据库服务器cpu利用率10 ...
- require-ensure
require-ensure 说明: require.ensure在需要的时候才下载依赖的模块,当参数指定的模块都下载下来了(下载下来的模块还没执行),便执行参数指定的回调函数.require.ens ...
- 关于hashmap 与concurrentHashMap
hashmap是不安全的,要实现安全,可以用Collections里面的synchronizedMap包裹来实现安全,或者用concurrentMap, 注意:hashtable是安全的 从JDK1. ...
- C/C++结构体语法总结
转自:http://blog.csdn.net/dawn_after_dark/article/details/73555562 结构体简介 结构体属于聚合数据类型的一类,它将不同的数据类型整合在一起 ...
- C++在VS下创建、调用dll
转自:http://www.cnblogs.com/houkai/archive/2013/06/05/3119513.html 目录 1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言 ...