工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。这个例子更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。贴代码了。

5.1.解释

main(),女娲

IHuman,产品接口

CYellowHuman,产品之一

CWhiteHuman,产品之二

CBlackHuman,产品之三

IHumanFactory,工厂接口

CYellowHumanFactory,工厂之一

CWhiteHumanFactory,工厂之二

CBlackHumanFactory,工厂之三

看代码:

//IHuman.h

#pragma once
class IHuman
{
public:
    IHuman(void)
    {
    }
    virtual ~IHuman(void)
    {
    }
    virtual void Laugh() = 0;
    virtual void Cry() = 0;
    virtual void Talk() = 0;
};

//YellowHuman.h

#pragma once
#include "ihuman.h"
class CYellowHuman :
    public IHuman
{
public:
    CYellowHuman(void);
    ~CYellowHuman(void);
    void Laugh();
    void Cry();
    void Talk();
};

//YellowHuman.cpp

#include "StdAfx.h"
#include "YellowHuman.h"
#include <iostream>
using std::cout;
using std::endl;
CYellowHuman::CYellowHuman(void)
{
}
CYellowHuman::~CYellowHuman(void)
{
}
void CYellowHuman::Cry()
{
    cout << "黄色人种会哭" << endl;
}
void CYellowHuman::Laugh()
{
    cout << "黄色人种会大笑,幸福呀!" << endl;
}
void CYellowHuman::Talk()
{
    cout << "黄色人种会说话,一般说的都是双字节" << endl;
}

//WhiteHuman.h

#pragma once
#include "ihuman.h"
class CWhiteHuman :
    public IHuman
{
public:
    CWhiteHuman(void);
    ~CWhiteHuman(void);
    void Laugh();
    void Cry();
    void Talk();
};

//WhiteHuman.cpp

#include "StdAfx.h"
#include "WhiteHuman.h"
#include <iostream>
using std::cout;
using std::endl;
CWhiteHuman::CWhiteHuman(void)
{
}
CWhiteHuman::~CWhiteHuman(void)
{
}
void CWhiteHuman::Cry()
{
    cout << "白色人种会哭" << endl;
}
void CWhiteHuman::Laugh()
{
    cout << "白色人种会大笑,侵略的笑声" << endl;
}
void CWhiteHuman::Talk()
{
    cout << "白色人种会说话,一般都是单字节" << endl;
}

//BlackHuman.h

#pragma once
#include "ihuman.h"
class CBlackHuman :
    public IHuman
{
public:
    CBlackHuman(void);
    ~CBlackHuman(void);
    void Laugh();
    void Cry();
    void Talk();
};

//BlackHuman.cpp

#include "StdAfx.h"
#include "BlackHuman.h"
#include <iostream>
using std::cout;
using std::endl;
CBlackHuman::CBlackHuman(void)
{
}
CBlackHuman::~CBlackHuman(void)
{
}
void CBlackHuman::Cry()
{
    cout << "黑人会哭" << endl;
}
void CBlackHuman::Laugh()
{
    cout << "黑人会笑" << endl;
}
void CBlackHuman::Talk()
{
    cout << "黑人可以说话,一般人听不懂" << endl;
}

//IHumanFactory.h

#pragma once
#include "IHuman.h"
class IHumanFactory
{
public:
    IHumanFactory(void)
    {
    }
    virtual ~IHumanFactory(void)
    {
    }
    virtual IHuman * CreateHuman() = 0;
};
//YellowHuman.h

#pragma once
#include "ihumanfactory.h"
class CYellowHumanFactory :
    public IHumanFactory
{
public:
    CYellowHumanFactory(void);
    ~CYellowHumanFactory(void);
    virtual IHuman * CreateHuman(void);
};

//YellowHumanFactory.cpp

#include "StdAfx.h"
#include "YellowHumanFactory.h"
#include "YellowHuman.h"
CYellowHumanFactory::CYellowHumanFactory(void)
{
}
CYellowHumanFactory::~CYellowHumanFactory(void)
{
}
IHuman * CYellowHumanFactory::CreateHuman( void )
{
    return new CYellowHuman();
}
//WhiteHuman.h

#pragma once
#include "ihumanfactory.h"
class CWhiteHumanFactory :
    public IHumanFactory
{
public:
    CWhiteHumanFactory(void);
    ~CWhiteHumanFactory(void);
    virtual IHuman * CreateHuman(void);
};

//WhiteHumanFactory.cpp

#include "StdAfx.h"
#include "WhiteHumanFactory.h"
#include "WhiteHuman.h"
CWhiteHumanFactory::CWhiteHumanFactory(void)
{
}
CWhiteHumanFactory::~CWhiteHumanFactory(void)
{
}
IHuman * CWhiteHumanFactory::CreateHuman( void )
{
    return new CWhiteHuman();
}
//BlackHuman.h

#pragma once
#include "ihumanfactory.h"
class CBlackHumanFactory :
    public IHumanFactory
{
public:
    CBlackHumanFactory(void);
    ~CBlackHumanFactory(void);
    virtual IHuman * CreateHuman();
};
//BlackHumanFactory.cpp

#include "StdAfx.h"
#include "BlackHumanFactory.h"
#include "BlackHuman.h"
CBlackHumanFactory::CBlackHumanFactory(void)
{
}
CBlackHumanFactory::~CBlackHumanFactory(void)
{
}
IHuman * CBlackHumanFactory::CreateHuman()
{
    return new CBlackHuman();
}

//FactoryMethod.cpp

// FactoryMethod.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "IHuman.h"
#include "YellowHuman.h"
#include "WhiteHuman.h"
#include "BlackHuman.h"
#include "SimpleHumanFactory.h"
#include "StandardHumanFactory.h"
#include "IHumanFactory.h"
#include "YellowHumanFactory.h"
#include "WhiteHumanFactory.h"
#include "BlackHumanFactory.h"
#include <iostream>
using std::cout;
using std::endl;
using std::string;
void DoFactoryMethod1()
{
    cout << "----------第一批人是这样的:黄种人工厂来生产黄种人" << endl;
    IHumanFactory *pHumanFactory = new CYellowHumanFactory();
    IHuman *pHuman = pHumanFactory->CreateHuman();
    pHuman->Cry();
    pHuman->Laugh();
    pHuman->Talk();
    delete pHuman;
    delete pHumanFactory;
}
void DoFactoryMethod2()
{
    cout << "----------第二批人是这样的:白种人工厂来生产白种人" << endl;
    IHumanFactory *pHumanFactory = new CWhiteHumanFactory();
    IHuman *pHuman = pHumanFactory->CreateHuman();
    pHuman->Cry();
    pHuman->Laugh();
    pHuman->Talk();
    delete pHuman;
    delete pHumanFactory;
}
void DoFactoryMethod3()
{
    cout << "----------第一批人是这样的:黑种人工厂来生产黑种人" << endl;
    IHumanFactory *pHumanFactory = new CBlackHumanFactory();
    IHuman *pHuman = pHumanFactory->CreateHuman();
    pHuman->Cry();
    pHuman->Laugh();
    pHuman->Talk();
    delete pHuman;
    delete pHumanFactory;
}
int _tmain(int argc, _TCHAR* argv[])
{
    //工厂方法
    cout << "----------工厂方法:" << endl;
    DoFactoryMethod1();
    DoFactoryMethod2();
    DoFactoryMethod3();
    
    _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
    _CrtDumpMemoryLeaks();
    return 0;
}

工厂方法属于创建型模式,适合于产品不太多的情况。产品如果很多,则需要用抽象工厂来实现。

最新文章

  1. Linux下MySQL数据库常用基本操作 一
  2. 转载文章----IL反编译利器——Ildasm.exe和Reflector.exe:
  3. IDEA 编译找不到符号,文件却没有错误。
  4. 使用Npoi向Excel中插入图片
  5. ZOJ 2677 Oil Deal(最大生成树)
  6. 【BZOJ】1088: [SCOI2005]扫雷Mine
  7. Java集合之Collection
  8. LeetCode(56):合并区间
  9. 阿里云日志服务采集自建Kubernetes日志(标准输出日志)
  10. solr 5.5使用 和pyg里 的4.10.3版 部署到tomcat中不一样(不使用内置jetty)
  11. 牛客网-《剑指offer》-矩形覆盖
  12. 有关https安全的相关内容介绍
  13. http-equiv=&quot;Refresh&quot; 实现定时刷新页面
  14. windows下使用RedisCluster集群简单实例
  15. Docker的volume机制实现容器数据的持久性存储
  16. 关于[x/y]一些小想法
  17. 【LOJ】#2542. 「PKUWC2018」随机游走
  18. 解决python2.x文件读写编码问题
  19. 算法 - 最小m段和问题
  20. OpenCV亚像素级的角点检测

热门文章

  1. Hudson管理平台自动化部署war包
  2. centos 6.5 安装jdk1.8
  3. 关于CURL的初步认识
  4. golang redis连接池使用方法
  5. MySQL中innodb_flush_log_at_trx_commit的设置
  6. SQL Server进阶(十一)可编程对象——变量、 批、流元素、 游标
  7. idea 创建运行web项目时,报错: Can not issue executeUpdate() for SELECTs解决方案
  8. PHP中的会话控制—session和cookie(实现数据传值功能)
  9. [C++]Linux之多进程运行代码框架
  10. cygwin 安装包管理器 apt-cyg