下面以女娲造黑人,白人,黄种人的例子来介绍一下工厂模式。

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)的更多相关文章

  1. 设计模式——工厂模式(Factory Method)

    工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方法使一个类的实例化延迟到其子类. UML图: 运算基类: package com.cnblog.clarck; /** * 数据 ...

  2. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  3. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  4. 工厂方法模式-Factory Method(Java实现)

    工厂方法模式-Factory Method 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法让实例化的具体内容交给子类工厂来进行. 本文中的例子是这样的. 生产一个身份证, ...

  5. 二十四种设计模式:工厂方法模式(Factory Method Pattern)

    工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...

  6. 设计模式-03工厂方法模式(Factory Method Pattern)

    插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...

  7. 六个创建模式之工厂方法模式(Factory Method Pattern)

    问题: 在使用简单工厂模式的时候,如果添加新的产品类,则必需修改工厂类,违反了开闭原则. 定义: 定义一个用于创建对象的接口,让子类决定具体实例化哪个产品类.此时工厂和产品都具有相同的继承结构,抽象产 ...

  8. 工厂模式(Factory Patter)

    1.工厂模式简介 工厂模式属于创建型模式,是专门用来创建对象的模式,抽象了实例化的过程.工厂模式分为 : 工厂方法模式.抽象工厂模式. 在学习工厂方法模式.抽象工厂之前,首先先要了解一下简单工厂模式, ...

  9. Spring 通过工厂方法(Factory Method)来配置bean

    Spring 通过工厂方法(Factory Method)来配置bean 在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. ...

随机推荐

  1. iOS 判断两个颜色是否相同

    今天做项目的时候,遇到一个小问题,就是获取UIButton的背景颜色用来和已知颜色做对比,进行点击事件.去查了下文档,有个方法正好可以处理这个问题. bool CGColorEqualToColor ...

  2. 二、用Delphi10.3 创建一条JSON数据的第二种方法,并格式化输出

    一.用Delphi10.3构造一个JSON数据的第二种方法,并格式化输出,代码如下: uses //System.JSON, System.JSON.Types, System.JSON.Writer ...

  3. 利用Dropbox中转自己的C2

    利用Dropbox中转自己的C2 0x00 前言 本来的目的呢,是利用dropbox中转自己的c2达到免杀的效果,然后可能是看了文章太久没抓住机会复现,到最后发现已经失效了,会被360拦截,所以好像也 ...

  4. go语言实战笔记(二)

     码代码之前一定要安装go,哈哈哈哈,反正我只装goland然后写不了代码报错,卡在第一段代码哈哈哈哈哈哈 新建项目goproject 新建src文件夹 新建main文件夹 新建第一个go文件 开始写 ...

  5. iOS Swift WisdomHUD 提示界面框架

    iOS Swift WisdomHUD 提示界面框架  Framework Use profile(应用简介) 一:WisdomHUD简介 今天给大家介绍一款iOS的界面显示器:WisdomHUD,W ...

  6. 基于Keras的imdb数据集电影评论情感二分类

    IMDB数据集下载速度慢,可以在我的repo库中找到下载,下载后放到~/.keras/datasets/目录下,即可正常运行.)中找到下载,下载后放到~/.keras/datasets/目录下,即可正 ...

  7. 深度学习—caffe框架训练文档

    转存:LMDB E:\机器学习2\caffe资料\caffe_root\caffe-master\Build\x64\Release>convert_imageset.exe E:/机器学习2/ ...

  8. 基于socketserver实现并发

    基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环 socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题) 一.分析socketserv ...

  9. jsp如何往js里传值

    1.jsp里定义id: 2.js里用j-query选择器获取(     $('#id).val();      )    或者docment.getEle....获取.

  10. 用CSS3做3D动画的那些事

    年会做了个3D变换的抽奖系统,在这里分享下通过CSS3制作3D效果的心得.抽奖系统虽然够炫酷,可惜抽的时候出了点bug,好几百人啊我的小心脏啊.虽然这个锅后面甩给会场的老爷电脑了(手动白眼). 首先介 ...