设计模式---工厂方法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)
在开发系统中,经常会碰到一个问题.现在需要实现的一些功能,但是这个功能模块以后一定是需要扩展的,那么现在开发中就不仅要实现现在的功能,还要考虑以后的扩展.那么为了系统的健壮,扩展就要遵循开闭原则(简单 ...
随机推荐
- django xadmin app models 注册
在app下新建adminx.py文件 # -*- coding: utf-8 -*- # 作者:神秘藏宝室 # 日期:2018/12/28 22:07 import xadmin from .mode ...
- 模块讲解----os
os:跟操作系统相关的信息 os模块的增删改查 一.cd进入: windowd: os.chdir("D:/软件/pychar/data/s13") print('获取当前位置:' ...
- 我与前端之间不得不说的三天两夜之javaScript
前端基础之JavaScript JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件 ...
- XVII Open Cup named after E.V. Pankratiev Grand Prix of Moscow Workshops, Sunday, April 23, 2017 Problem D. Great Again
题目: Problem D. Great AgainInput file: standard inputOutput file: standard outputTime limit: 2 second ...
- [转]Ubuntu使用Wireshark找不到interface的解决方法
Wireshark是一款强大的有图形界面的网络封包分析工具. dumpcap需要root权限才能使用的,以普通用户打开Wireshark,Wireshark当然没有权限使用dumpcap进行截取封包. ...
- android整理的一些基础知识
本篇文章内容大部分是来源于本人实际开发中的心得总结,不是非常全面,咱才疏学浅,如果有错误的地方恳请各位指出哦~ android四大组件 四大组件包括:Activity(活动),Service(服务), ...
- 关于jQuery获得表单radio类型输入框的选中值
var item=$("input[name='w1']checked").val(); 下面这句,问题解决(加上[type='radio']:): var item=$(&quo ...
- 分布式系统 SOA与中间件
在分布式系统中,有一个基础的理论 CAP,Consistency一致性 Availability可用性 Partition Tolerance分区容忍性,任何一个系统都不可能同时满足这三个条件(高富帅 ...
- 【Python】__slots__ 、@property、多重继承、定制类、枚举类、元类
__slots__ @property 多重继承 定制类 枚举类 元类 [使用__slots__] 1.动态语言的一个特点就是允许给实例绑定任意的方法和变量,而静态语言(例如Java)必须事先将属性方 ...
- Activiti工作流引擎数据库表结构
Activiti工作流引擎数据库表结构 一.数据库表的命名 Acitiviti数据库中表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识.此用例大体与服务API是匹配的. ACT_RE_ ...