您的位置:首页 > 其它

设计模式-prototype原型

2016-07-01 09:13 281 查看
1. 精髓:

   克隆(复制已有)

2.设计方法

  2.1 prototype类提供clone接口;

  2.2 个子类实现clone方法;

  3.3 操作类需要调用子类对象时使用子类的clone方法生成对象;

3.适用

  当一个系统应该独立于它的产品创建/构成和表示时,要使用prototype模式。

4.效果

  4.1 改变值以指定新对象,比如我要创建n个坦克,我先创建一个坦克对象,给该对象配备弹药后,我再克隆n-1个坦克对象;

  4.2 改变结构以指定新对象,比如我克隆(深拷贝)了一个配备弹药的坦克,然后我给坦克配备上了驾驶员,护卫队,使其成为一个坦克军团,然后我又克隆了n-1个坦克军团,我就有n个坦克军团了;

  4.3 运行时增加删除产品,大鱼吃小鱼游戏中,小鱼吃了小鱼变成了中鱼,我克隆了一堆中鱼;中鱼吃了小鱼变成的大鱼,我又克隆了一堆大鱼。

5.进阶

  5.1 浅拷贝;

  5.2 深拷贝。

6. 例子#include <iostream>
#include <vector>
using namespace std;

class Soldier {
public:
Soldier()
{
cout << "Soldier concreate !" << endl;
}
Soldier * Clone() const{
cout << "Soldier clone !" << endl;
return new Soldier(*this);
}
private:
};

class Tank {
public:
Tank():shellArmed(0)
{
cout << "Tank concreate !" << endl;
}
Tank *Clone() const{
cout << "Tank clone !" << endl;
return new Tank(*this);
}
void armShells(int num){
cout << "Arm " << num << " artillery shells !" << endl;
shellArmed = num;
}
void fire(){
if(shellArmed > 0) {
while(shellArmed !=0) {
cout << "Fire ~~~ BOOM ~~~ " ;
shellArmed--;
cout << " Shell remained : " << shellArmed << endl;
}

}
else{
cout << "No artillery shell armed, please arm artillery shell!" << endl;
}
}

private:
int shellArmed;
};

class PrototypeFactory{
public:
PrototypeFactory(Soldier* s, Tank* t){
cout << "PrototypeFactory concreate !" << endl;
_prototypeSoldier = s;
_prototypeTank = t;
}
Soldier* makeSolider() const{
_prototypeSoldier->Clone();
}
Tank* makeTank() const{
_prototypeTank->Clone();
}

private:
Soldier* _prototypeSoldier;
Tank* _prototypeTank;

};

class Army{
public:
Army(int sNum, int tNUm):soilderNum(sNum),tankNum(tNUm){
cout << "Want a army with " << sNum << " soilders and " << tNUm << " tanks !!!" << endl;
}
void creatArmy(PrototypeFactory* pf){
for(int i=0; i<soilderNum; i++){
soilderVector.push_back(pf->makeSolider());
}
for(int i=0; i<tankNum; i++){
tankVector.push_back(pf->makeTank());
}
cout << "Army created!!!" << endl;
}

void armyFire()
{
for(vector<Tank*>::iterator it = tankVector.begin(); it !=tankVector.end(); it++) {
cout <<endl << "Tank " << (it-tankVector.begin() +1) << endl << "---------------------------" << endl;
(*it)->fire();
}

}

private:
vector<Soldier*> soilderVector;
vector<Tank*> tankVector;
int soilderNum;
int tankNum;
};

int main() {
cout << "Hello, World!" << endl;
Soldier *soldier = new Soldier();

Tank *tank = new Tank();
tank->armShells(10);

PrototypeFactory* pf = new PrototypeFactory(soldier, tank);

Army* army = new Army(10,3);
army->creatArmy(pf);
army->armyFire();
/*
Tank *tank = new Tank();
tank->fire();
tank->armShells(3);
tank->fire();

Tank *cloneTank = tank->Clone();
cloneTank->fire();*/

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: