c++工厂模式(Factory method)
下面以女娲造黑人,白人,黄种人的例子来介绍一下工厂模式。
1.工厂的接口,相当于造人工厂总部。
class IHumanFactory
{
public:
IHumanFactory(void)
{ }
~IHumanFactory(void)
{ }
virtual IHuman* CreateHuman() = ; };
2.造人各个的部门
class WhiteHumanFactory: public IHumanFactory
{
public:
WhiteHumanFactory(void)
{ }
~WhiteHumanFactory(void)
{ }
IHuman *CreateHuman()
{
return new WhiteHuman();
} }; class YellowHumanFactory: public IHumanFactory
{
public:
YellowHumanFactory(void)
{ }
~YellowHumanFactory(void)
{ }
IHuman *CreateHuman()
{
return new YellowHuman();
} }; class BlackHumanFactory: public IHumanFactory
{
public:
BlackHumanFactory(void)
{ }
~BlackHumanFactory(void)
{ }
IHuman *CreateHuman()
{
return new BlackHuman();
} };
3.各种人的特征。
class IHuman
{
public:
IHuman(void)
{ }
~IHuman()
{ }
virtual void Laugh() = ;
virtual void Cry() = ;
virtual void Talk() = ; }; class WhiteHuman : public IHuman
{
public:
WhiteHuman(void)
{ }
~WhiteHuman(void)
{ }
void Laugh()
{
std::cout << "白种人笑!" << std::endl;
}
void Cry()
{
std::cout << "白种人哭!" <<std::endl;
}
void Talk()
{
std::cout << "白种人说话!" <<std::endl;
}
}; class YellowHuman : public IHuman
{
public:
YellowHuman(void)
{ }
~YellowHuman(void)
{ }
void Laugh()
{
std::cout << "黄种人笑!" << std::endl;
}
void Cry()
{
std::cout << "黄种人哭!" <<std::endl;
}
void Talk()
{
std::cout << "黄种人说话!" <<std::endl;
}
}; class BlackHuman : public IHuman
{
public:
BlackHuman(void)
{ }
~BlackHuman(void)
{ }
void Laugh()
{
std::cout << "黑种人笑!" << std::endl;
}
void Cry()
{
std::cout << "黑种人哭!" <<std::endl;
}
void Talk()
{
std::cout << "黑种人说话!" <<std::endl;
}
};
4.主函数
int main()
{
std::cout << "#1.制造黄种人"<<std::endl;
IHumanFactory *pHumanFactory = new YellowHumanFactory();
IHuman * pHuman = pHumanFactory->CreateHuman();
pHuman->Cry();
pHuman->Laugh();
pHuman->Talk();
delete pHuman;
delete pHumanFactory; std::cout << "#1.制造白种人"<<std::endl;
IHumanFactory *pHumanFactory2 = new WhiteHumanFactory();
IHuman * pHuman2 = pHumanFactory->CreateHuman();
pHuman->Cry();
pHuman->Laugh();
pHuman->Talk();
delete pHuman2;
delete pHumanFactory2; std::cout << "#1.制造黑种人"<<std::endl;
IHumanFactory *pHumanFactory3 = new BlackHumanFactory();
IHuman * pHuman3 = pHumanFactory->CreateHuman();
pHuman->Cry();
pHuman->Laugh();
pHuman->Talk();
delete pHuman3;
delete pHumanFactory3; getchar();
return ; }
输出结果:
#.制造黄种人
黄种人哭!
黄种人笑!
黄种人说话!
#.制造白种人
白种人哭!
白种人笑!
白种人说话!
#.制造黑种人
黑种人哭!
黑种人笑!
黑种人说话!
工厂模式的好处:
工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A(). 工厂模式也是用来创建实例对象的,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
类Sample为例,要创建Sample的实例对象:
Sample sample=new Sample();
可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等
首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成:
Sample sample=new Sample(参数);
但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码很难看了
初
始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对
象的原则,面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”
起来(减少段和段之间偶合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。
我们需要将创建实例的工作与使用实例的工作分开, 也就是说,让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。
你想如果有多个类似的类,我们就需要实例化出来多个类。这样代码管理起来就太复杂了。
这个时候你就可以采用工厂方法来封装这个问题。
不能再用上面简单new Sample(参数)。还有,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.现在Sample是接口,有两个子类MySample 和HisSample
Sample mysample=new MySample();
Sample hissample=new HisSample();
采用工厂封装:
public class Factory{
public static Sample creator(int which){
//getClass 产生Sample 一般可使用动态类装载装入类。
if (which==1)
return new SampleA();
else if (which==2)
return new SampleB();
}
}
那么在你的程序中,如果要实例化Sample时.就使用
Sample sampleA=Factory.creator(1);
举
个更实际的例子,比如你写了个应用,里面用到了数据库的封装,你的应用可以今后需要在不同的数据库环境下运行,可能是oracle,db2,sql
server等,那么连接数据库的代码是不一样的,你用传统的方法,就不得不进行代码修改来适应不同的环境,非常麻烦,但是如果你采用工厂类的话,将各种
可能的数据库连接全部实现在工厂类里面,通过你配置文件的修改来达到连接的是不同的数据库,那么你今后做迁移的时候代码就不用进行修改了。
我通常都是用xml的配置文件配置许多类型的数据库连接,非常的方便。PS:工厂模式在这方面的使用较多。
c++工厂模式(Factory method)的更多相关文章
- 设计模式——工厂模式(Factory Method)
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方法使一个类的实例化延迟到其子类. UML图: 运算基类: package com.cnblog.clarck; /** * 数据 ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- 工厂方法模式-Factory Method(Java实现)
工厂方法模式-Factory Method 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法让实例化的具体内容交给子类工厂来进行. 本文中的例子是这样的. 生产一个身份证, ...
- 二十四种设计模式:工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...
- 设计模式-03工厂方法模式(Factory Method Pattern)
插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...
- 六个创建模式之工厂方法模式(Factory Method Pattern)
问题: 在使用简单工厂模式的时候,如果添加新的产品类,则必需修改工厂类,违反了开闭原则. 定义: 定义一个用于创建对象的接口,让子类决定具体实例化哪个产品类.此时工厂和产品都具有相同的继承结构,抽象产 ...
- 工厂模式(Factory Patter)
1.工厂模式简介 工厂模式属于创建型模式,是专门用来创建对象的模式,抽象了实例化的过程.工厂模式分为 : 工厂方法模式.抽象工厂模式. 在学习工厂方法模式.抽象工厂之前,首先先要了解一下简单工厂模式, ...
- Spring 通过工厂方法(Factory Method)来配置bean
Spring 通过工厂方法(Factory Method)来配置bean 在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. ...
随机推荐
- 在线调整InnoDB Buffer Pool Size
InnoDB Buffer Pool主要是用来缓存数据表和索引数据的内存区域,它的默认值为134217728字节(128MB).最大值取决于CPU架构;32位系统上的最大值为4294967295(23 ...
- Oracle透明网关访问MySQL数据库
针对oracle数据库不同实例之间的数据访问,我们可以直接通过dblink访问,如果oracle数据库想访问mysql/sqlserver等数据库的数据,我们可以通过配置oracle透明网关实现异构数 ...
- 安卓isEmpty()的注意事项,主要判断NULL
项目中服务器返回的字符串有可能为NULL或者没有内容,习惯性直接用String.isEmpty() 运行中发现字符串为NULL的时候就会出错,之前有查百度看到过正确的用法,但一直没在意, 就直接加多一 ...
- Kafka基础认识
1):Apache kafka介绍及架构详解 假设一个场景: 数据源: 应用系统A 产生的用户访问数据和订单数据 10000 条一秒钟 push:推送数据 消息系统:队列 产生的数据量>数据量 ...
- 运行第一个ruby程序
0x00 安装 首先需要安装一个ruby的环境,ruby分为win.linux.macOS版本.不用系统安装方法略有差异,不在这进行讲解. 0x01 运行第一个ruby程序 我这里是win环境,打开命 ...
- msserver的update or insert语句
方案1:SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; IF EXISTS (SELECT 1 FROM dbo.ta ...
- 41-mysql作业
1 2 3 4
- 5469: [FJOI2018]领导集团问题
5469: [FJOI2018]领导集团问题 链接 题意: 要求在一棵树内选一个子集,满足子集内的任意两个点u,v,如果u是v的祖先,那么u的权值小于等于v. 分析: dp[u][i]表示在u的子树内 ...
- VI ORB-SLAM初始化与VINS初始化对比(将vi orb-slam初始化方法移植到vins中)
初始化时需要求出的变量:相机和imu外参r t.重力g.尺度s.陀螺仪和加速度计偏置ba bg. 下面对两种算法初始化的详细步骤进行对比: 求陀螺仪偏置bg 求解公式相同,求解方法不同.公式如下,VI ...
- python面试题(三)
一.项目技术点梳理 (一)Django项目 本项目是用python的Django框架开发的前后端不分离项目.项目采用MVT架构,使用的MySQL和redis数据库,用Django自带的orm与数据库交 ...