标签:style blog http io color os sp on div
意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
实用性:1.当要实例化的类是在运行时刻指定时。
2.为了避免创建一个与产品类层次平行的工厂类层次时。
3.当一个类的实例只能有几个不同状态组合中的一种时。
效果: 1.可以在运行时刻增加产品。
2.改变值以指定新对象。
3.改变结构以指定新对象。
4.减少子类的构造。
5.用类动态配置应用。
结构:
原型模式让我们不用重新初始化对象,而是动态地获得对象运行时的状态,并且在不确定对象类型的时候能
创建出对应新对象。
代码实例:
#ifndef _GOODS_ #define _GOODS_ #include <string> #include <iostream> using namespace std; class AbsGoods{ public: virtual AbsGoods* Clone() = 0; virtual void PrintfInfo(){cout<<*_mpMaster<<"‘s "<<_mName<<endl; } protected: AbsGoods(const AbsGoods& another){} ~AbsGoods(){delete _mpMaster; } AbsGoods(){} string _mName; string* _mpMaster; }; class Mp3:public AbsGoods{ public: Mp3(string Master){_mName = "Mp3";_mpMaster = new string;*_mpMaster = Master;} Mp3(const Mp3& another) { _mName = another._mName; _mpMaster = new string; *_mpMaster = *(another._mpMaster); } ~Mp3(){delete _mpMaster;} virtual AbsGoods* Clone() { return new Mp3(*this); } }; class Computer:public AbsGoods{ public: Computer(string Master){_mName = "Computer";_mpMaster = new string;*_mpMaster = Master;} Computer(const Computer& another) { _mName = another._mName; _mpMaster = new string; *_mpMaster = *(another._mpMaster); } ~Computer(){delete _mpMaster;} virtual AbsGoods* Clone() { return new Computer(*this); } }; #endif
现在假设Merry的爸爸买了一台电脑
AbsGoods* pGoods1 = new Computer("Merry‘dad");
然后Merry的爸爸把电脑送给她
pGoods1->SetMaster("Merry");
然后Mical也想要一台和Merry一样的电脑。但是因为只知道pGoods1 ,不能确定其类型。
无法AbsGoods* pGoods2 = new Computer("Mical");
Prototype 让我们可以不确定对象类型的时候能创建出对应新对象
AbsGoods* pGoods2 = pGoods1->Clone();
pGoods2->SetMaster("Mical");
假设电脑还要配置很多特性,如Memory,CPU等。Prototype让我们不用重新初始化对象
pGoods1 对应物品的各种属性都被拷贝到 pGoods2 了。
#include <iostream> using namespace std; #include "Prototype.h" int main() { AbsGoods* pGoods1 = new Computer("Merry"); pGoods1->PrintfInfo(); AbsGoods* pGoods2 = pGoods1->Clone(); pGoods2->SetMaster("Mical"); pGoods2->PrintfInfo(); return 0; }
--------新手初学,望大神指点--------
标签:style blog http io color os sp on div
原文地址:http://www.cnblogs.com/wrbxdj/p/4171483.html