首页 > 代码库 > 原型模式
原型模式
意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
实用性: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;}
--------新手初学,望大神指点--------
原型模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。