原型模式
前序
這回小菜準(zhǔn)備去應(yīng)聘了,大鳥(niǎo)看了小菜的簡(jiǎn)歷后感覺(jué)他都是在瞎扯.小菜準(zhǔn)備了很多份相同的簡(jiǎn)歷.于是大鳥(niǎo)便讓小菜同學(xué)通過(guò)編寫代碼來(lái)實(shí)現(xiàn)相同的三份簡(jiǎn)歷.
不久后小菜實(shí)現(xiàn)了第一版的代碼.
小菜的第一版代碼
#include <stdio.h>
class Resume
{
public:
Resume(char* _name) : name(_name),sex(0),age(0),timeArea(0),company(0){}
void SetPersonalInfo(char* _sex,char* _age)
{
sex = _sex;
age = _age;
}
void SetWorkExperience(char* _timeArea,char* _company)
{
timeArea = _timeArea;
company = _company;
}
void Display()
{
printf("%s %s %s\n",name,sex,age);
printf("工作經(jīng)歷:%s %s",timeArea,company);
}
protected:
char* name;
char* sex;
char* age;
char* timeArea;
char* company;
};
int main()
{
Resume a("大鳥(niǎo)");
a.SetPersonalInfo("男","29");
a.SetWorkExperience("1998-2000","XX公司");
Resume b("大鳥(niǎo)");
b.SetPersonalInfo("男","29");
b.SetWorkExperience("1998-2000","XX公司");
Resume c("大鳥(niǎo)");
c.SetPersonalInfo("男","29");
c.SetWorkExperience("1998-2000","XX公司");
a.Display();
b.Display();
c.Display();
return 0;
}
大鳥(niǎo)看后說(shuō)到:”三份簡(jiǎn)歷需要三次初始化,這樣客戶端的代碼很麻煩,如果要二十份那就要二十次初始化.”
小菜答到:”是的.如果寫錯(cuò)了一個(gè)字那就要改二十次.”
于是大鳥(niǎo)便叫小菜用原型模式重寫了一遍代碼.
原型模式
通過(guò)給出一個(gè)原型對(duì)象來(lái)指明所要?jiǎng)?chuàng)建的對(duì)象的類型,然后用復(fù)制這個(gè)原型對(duì)象的方法創(chuàng)建出更多同類型的對(duì)象。原始模型模式允許動(dòng)態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需要非得有任何事先確定的等級(jí)結(jié)構(gòu),原始模型模式適用于任何的等級(jí)結(jié)構(gòu)。缺點(diǎn)是每一個(gè)類都必須配備一個(gè)克隆方法。
實(shí)現(xiàn)方式(UML類圖)

實(shí)現(xiàn)代碼
#include <stdio.h>
class ICloneable
{
public:
virtual ICloneable* Clone()=0;
};
// 工作經(jīng)歷
class WorkExperience : public ICloneable
{
public:
char*& WorkDate()
{
return workDate;
}
char*& Company()
{
return company;
}
virtual WorkExperience* Clone()
{
WorkExperience* Result = new WorkExperience();
Result->WorkDate() = workDate;
Result->Company() = company;
return Result;
}
protected:
char* workDate;
char* company;
};
// 簡(jiǎn)歷
class Resume : public ICloneable
{
public:
Resume(char* _name) : name(_name),work(new WorkExperience()){}
~Resume()
{
delete work;
}
void SetPersonalInfo(char* _sex,char* _age)
{
sex = _sex;
age = _age;
}
void SetWorkExperience(char* _workDate,char* _company)
{
work->WorkDate() = _workDate;
work->Company() = _company;
}
void Display()
{
printf("%s %s %s\n",name,sex,age);
printf("工作經(jīng)歷:%s %s\n",work->WorkDate(),work->Company());
}
virtual Resume* Clone()
{
Resume* Result = new Resume(work);
Result->name = name;
Result->sex = sex;
Result->age = age;
return Result;
}
protected:
Resume(WorkExperience* _work)
{
work = _work->Clone();
}
char* name;
char* sex;
char* age;
WorkExperience* work;
};
int main()
{
Resume* a = new Resume("大鳥(niǎo)");
a->SetPersonalInfo("男","29");
a->SetWorkExperience("1998-2000","XX公司");
Resume* b = a->Clone();
b->SetWorkExperience("1998-2006","YY企業(yè)");
Resume* c = a->Clone();
c->SetPersonalInfo("男","24");
c->SetWorkExperience("1998-2003","ZZ企業(yè)");
a->Display();
b->Display();
c->Display();
delete a;
delete b;
delete c;
return 0;
}
運(yùn)行結(jié)果

所有文件打包下載
posted on 2011-05-12 16:20
lwch 閱讀(2006)
評(píng)論(1) 編輯 收藏 引用 所屬分類:
設(shè)計(jì)模式