学习设计模式

本文介绍了由“四人帮”提出的23个经典设计模式中的工厂模式、单例模式及建造者模式,并提供了C++实现示例代码。通过侯捷老师的讲解,详细剖析了这些模式在实际开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     这个暑假我们学院邀请了侯捷老师到我们学院给我们讲了为期一周的软件设计模式课程。在之前已经陆陆续续的了解了好几个模式,在这次系统的学习中受益匪浅。侯捷老师讲课确实很好,他很细致的给我们挖掘源代码,就如他写的《深入浅出MFC》一样,给我们展示了好久个开源库中所用到得设计模式。

现在将由“四人帮”提出的23个模式一一介绍:(用C++实现)

 

#include <iostream>
#include <string>
#include <map>
#include <assert.h>
using namespace std;

// 1. ////begin. factory-pattern.///////////////////////////////////////////////////////////
//base class
class CObject
{
public:
 static CObject* CreateObject(void){
  return new  CObject();
 }
public:
 virtual void SayHello(){cout << "hello, I am CObject class." << endl;}
};

//create object factory.
class CObjectFactory
{
public:
 typedef CObject* (*PFNCREATE)(void);
 bool Register(const string& className, PFNCREATE pfnCreate){
  map<string, PFNCREATE>::value_type val(className, pfnCreate);
  return m_CreateMap.insert(val).second;
 }
 CObject* CreateObject(const string& className){
  map<string, PFNCREATE> ::iterator it = m_CreateMap.find(className);
  if (it != m_CreateMap.end())
  {
   PFNCREATE pfnCreate = it->second;
   return pfnCreate();
  }
  return NULL;
 }
 static CObjectFactory& Instance(){
  static CObjectFactory* pOnlyObjectFactory = new CObjectFactory;
  return *pOnlyObjectFactory;
 }
private:
 CObjectFactory(){}
 ~CObjectFactory(){}
 
 map<string, PFNCREATE> m_CreateMap;
};
#define ObjectFactory CObjectFactory::Instance()

//a derived class of CObject for test.
class CChild:public CObject
{
public:
 static CObject* CreateObject(){
  return new CChild();
 }
public:
 virtual void SayHello(){cout << "hello, I am CChild class." << endl;}
};
// 1. ////end. factory-pattern.///////////////////////////////////////////////////////////


// 2. ////begin. single instance-pattern./////////////////////////////////////////////////
class CSingleObject
{
public:
 static CSingleObject& Instance(){
  if (m_pOnlyInstance.get() == NULL)
  {
   m_pOnlyInstance.reset(new CSingleObject);
  }
  return (*m_pOnlyInstance.get());
 }
public:
 void SayHello(){
  cout << "hello, I am CSingleObject." << endl;
 }
    //TODO: add your new methods here.

private:
 friend class auto_ptr<CSingleObject>;
 static auto_ptr<CSingleObject> m_pOnlyInstance;
 CSingleObject(){cout <<"CSingleObject Constructor." << endl;}
 ~CSingleObject(){cout <<"CSingleObject Destructor." << endl;}
};
//initialize the static data member.
auto_ptr<CSingleObject> CSingleObject::m_pOnlyInstance;
#define  SingleObject CSingleObject::Instance()
// 2. ////end. single instance-pattern./////////////////////////////////////////////////

//3.////begin. builder.//////////////////////////////////////////////////////
//base class
class CSomething{};
class CHead:public CSomething{};
class CBody:public CSomething{};
class CFoot:public CSomething{};
class CHorse:public CSomething
{
public:
 void AddHead(CHead* pHead){}
 void AddBody(CBody* pBody){}
 void AddFoot(CFoot* pFoot){}
};
//builder base class.
class CSomethingBuilder
{
public:
 CSomethingBuilder(){}
 virtual void BuildSomething(){}
 virtual void BuildPartA(){}
 virtual void BuildPartB(){}
 virtual void BuildPartC(){}
 virtual CSomething* GetSomething(){ return static_cast<CSomething*>(0);}
};
class CAHorseBuilder:public CSomethingBuilder
{
public:
 CAHorseBuilder():CSomethingBuilder(), m_pHorseItem(0){}
 virtual void BuildSomething(){
  m_pHorseItem = new CHorse;
 }
 virtual void BuildPartA(){
  assert(m_pHorseItem != 0);
  CHead* pHead = new CHead;
  m_pHorseItem->AddHead(pHead);
 }
 virtual void BuildPartB(){
  assert(m_pHorseItem != 0);
  CBody* pBody = new CBody;
  m_pHorseItem->AddBody(pBody);
 }
 virtual void BuildPartC(){
  assert(m_pHorseItem != 0);
  CFoot* pFoot = new CFoot;
  m_pHorseItem->AddFoot(pFoot);
 }
 virtual CSomething* GetSomething(){ return m_pHorseItem;}
private:
 CHorse*  m_pHorseItem;
};

class CGame
{
public:
 CGame(){};
 ////other code here...

public:
 CSomething* CreateHorse(CSomethingBuilder& builder){
  builder.BuildSomething();
  builder.BuildPartA();//add head.
  builder.BuildPartB();//add body.

  builder.BuildPartC();//add a foot.
  builder.BuildPartC();//add a foot.
  builder.BuildPartC();//add a foot.
  builder.BuildPartC();//add a foot.
  return builder.GetSomething();
 }
};
//3.////end.builder./////////////////////////////////////////////////////////

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值