博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原型模式(Prototype)C++实现
阅读量:5103 次
发布时间:2019-06-13

本文共 2640 字,大约阅读时间需要 8 分钟。

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

 

实用性:1.当要实例化的类是在运行时刻指定时。

    2.为了避免创建一个与产品类层次平行的工厂类层次时。

    3.当一个类的实例只能有几个不同状态组合中的一种时。

 

效果:   1.可以在运行时刻增加产品。

    2.改变值以指定新对象。

    3.改变结构以指定新对象。

    4.减少子类的构造。

    5.用类动态配置应用。

 

结构:

原型模式让我们不用重新初始化对象,而是动态地获得对象运行时的状态,并且在不确定对象类型的时候能

创建出对应新对象。

 

代码实例:

#ifndef _Prototype_

#define _Prototype_
#include <string>
#include <iostream>
using namespace std;

class AbsGoods{

public:
virtual AbsGoods* Clone() = 0;
string _mName;

protected:

AbsGoods(const AbsGoods& another){}
~AbsGoods(){}
AbsGoods(){}

int _Price;
};

class Mp3:public AbsGoods{

public:
Mp3(){_mName = "MP3"; _Price = 200;}
Mp3(const Mp3& another)
{
_mName = another._mName;
_Price = another._Price;
}

virtual AbsGoods* Clone()

{
return new Mp3(*this);
}
};

class Computer:public AbsGoods{

public:
Computer(const Computer& another)
{
_mName = another._mName;
_Price = another._Price;
}
Computer(){_mName = "COMPUTER"; _Price = 4000;}

virtual AbsGoods* Clone()

{
return new Computer(*this);
}
};

class Person{

public:
Person(){_CountGoods = 0;}
bool addGoods(AbsGoods* aGoods)
{
if(NULL == aGoods) return false;
if(_CountGoods >= 10)
return false;
_myGoods[_CountGoods] = aGoods;
_CountGoods++;
return true;
}
void out()
{
for(int i=0; i<_CountGoods; i++)
{
cout<<_myGoods[i]->_mName<<" ";
}
}
AbsGoods* getGoods(int Num)
{
return _myGoods[Num-1];
}

private:

AbsGoods* _myGoods[10];
int _CountGoods;
};

class Mical : public Person{

public:
static Mical* getMical()
{
if(NULL == _thisMical)
{
_thisMical = new Mical;
}
return _thisMical;
}

private:

Mical(){}
Mical(const Mical& another){}
void operator = (const Mical& another);

static Mical* _thisMical;

};

class Merry : public Person{

public:
static Merry* getMerry()
{
if(NULL == _thisMerry)
{
_thisMerry = new Merry;
}
return _thisMerry;
}

private:

Merry(){}
Merry(const Merry& another){}
void operator = (const Merry& another);

static Merry* _thisMerry;

};

#endif

 

现Mical有一台电脑和一架Mp3

mical->addGoods(new Computer);

mical->addGoods(new Mp3);

 

然后Merry觉得Mical有的我也要有

for(int i=0; i<mical->getGoodsNum(); i++)

{
merry->addGoods(mical->getGoods(i+1)->Clone());
}

这里实现了不确定对象类型的时候能创建出对应新对象

 

mian函数代码如下:

#include <iostream>

using namespace std;

#include "Prototype.h"

Mical* Mical::_thisMical = NULL;

Merry* Merry::_thisMerry = NULL;

int main()

{
Mical* mical = Mical::getMical();
Merry* merry = Merry::getMerry();
mical->addGoods(new Computer);
mical->addGoods(new Mp3);
for(int i=0; i<mical->getGoodsNum(); i++)
{
merry->addGoods(mical->getGoods(i+1)->Clone());
}

cout<<"Mical's Goods : ";

mical->out();
cout<<endl;
cout<<"Merry's Goods : ";
merry->out();

return 0;

}

转载于:https://www.cnblogs.com/wrbxdj/p/4171483.html

你可能感兴趣的文章
微服务之初了解(一)
查看>>
GDOI DAY1游记
查看>>
收集WebDriver的执行命令和参数信息
查看>>
数据结构与算法(三)-线性表之静态链表
查看>>
mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
查看>>
快速幂
查看>>
改善C#公共程序类库质量的10种方法
查看>>
AIO 开始不定时的抛异常: java.io.IOException: 指定的网络名不再可用
查看>>
MyBaits动态sql语句
查看>>
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>
用户空间与内核空间,进程上下文与中断上下文[总结]
查看>>
JS 中的跨域请求
查看>>
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
[Data Structure & Algorithm] 有向无环图的拓扑排序及关键路径
查看>>
cassandra vs mongo (1)存储引擎
查看>>