这个暑假我们学院邀请了侯捷老师到我们学院给我们讲了为期一周的软件设计模式课程。在之前已经陆陆续续的了解了好几个模式,在这次系统的学习中受益匪浅。侯捷老师讲课确实很好,他很细致的给我们挖掘源代码,就如他写的《深入浅出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./////////////////////////////////////////////////////////