设计模式-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;
}
克隆(复制已有)
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;
}
相关文章推荐
- 开源 java CMS - FreeCMS2.5 系统配置
- ActivityManager查看笔记
- POJ1274
- 软件开发模式对比(瀑布、迭代、螺旋、敏捷)
- STS-新建mvc工程--helloworld
- 基于ASP.NET MVC和Bootstrap搭建响应式个人博客站(一)
- springMVC配置Json
- 每天一个Linux命令(64)shutdown命令
- android中invalidate()的自动清屏含义以及屏幕刷新
- [2016/07/01] LeetCode / Java - Day 09 -
- 异常处理UncaughtExceptionHandler
- 程序的机器级表示
- iOS-最全的App上架教程
- 短声音
- 信与信封问题(codevs 1222)
- ASP.NET MVC+Bootstrap个人博客之praise.js点赞特效插件(二)
- 3分钟实现iOS语言本地化/国际化(图文详解)
- 初次邂逅swift
- 简洁开发系列
- android图片轮播效果,RollViewPager的简单使用