设计模式---工厂方法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)
在开发系统中,经常会碰到一个问题.现在需要实现的一些功能,但是这个功能模块以后一定是需要扩展的,那么现在开发中就不仅要实现现在的功能,还要考虑以后的扩展.那么为了系统的健壮,扩展就要遵循开闭原则(简单 ...
随机推荐
- Webservice介绍
一. Socket和Http通信协议介绍 1. Socket协议简单介绍 Socket位于传输层,它是对Tcp/ip协议的实现,包含TCP/UDP,它是所有通信协议的基础,如下为Socket通 ...
- JPG PNG GIF 的优缺点
pg/jpeg:优点:体积比png小,打开速度比png快缺点:属于有损压缩,每次保存都会产生数据损失(jpeg artifacts), 故不适合用于多次编辑保存.压缩率过高图像会失真PS:网络上最最常 ...
- Extjs3.4 grid中添加一列复选框
var sm = new Ext.grid.CheckboxSelectionModel(); var cm = new Ext.grid.ColumnModel( [ sm, new Ext.gri ...
- jQuery—$让渡
方法1:(取别名) 方法2:(指定作用域) 场景用例: 解决方案:方法1(取别名) 解决方案:方法2(指定作用域)
- Spark SQL慕课网日志分析(1)--系列软件(单机)安装配置使用
来源: 慕课网 Spark SQL慕课网日志分析_大数据实战 目标: spark系列软件的伪分布式的安装.配置.编译 spark的使用 系统: mac 10.13.3 /ubuntu 16.06,两个 ...
- DevOps架构实践
1. 场景 持续部署:业界没有统一明确地定义,简单理解为将集成结果部署到不同的环境供用户使用,并且立即反馈部署结果的实践,其中不同的环境包括:开发环境.测试环境.预发布环境.生产环境 持续部署两个核心 ...
- dubbo总结
一 .Dubbo产生背景 单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键. 垂直应用架构当访 ...
- string integer == equals 转
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(== ...
- vue下载文件
import fileDownload from 'js-file-download' let params = { ", ", "filename":&quo ...
- js小工具---本地图片转换为base64编码数据
今天用jmeter对图片对比进行性能测试,post请求为json请求,图片为Base64编码后的图片数据.所以需要将一张本地图片生成base64编码,找到一个js小工具,记录在这儿便于以后复用. 效果 ...