【发布时间】:2015-05-17 05:50:49
【问题描述】:
我正在努力学习设计模式。我是一名 C++ 程序员。目前,我正在处理原型模式。我可以将原型与工厂类型关联起来。但是,工厂模式和原型模式之间存在很多差异。例如,在原型模式中,每个派生类都向基类/超类注册其原型。
但是,看着wikipedia article - 我无法理解以下几点。
无需在每次创建新对象时检索数据并重新解析它,原型模式可用于在需要新对象时简单地复制原始对象。
避免以标准方式(例如,使用“new”关键字)创建新对象的内在成本,因为它对于给定的应用程序来说过于昂贵。
这是我为演示 C++ 中的原型模式而创建的程序。但是,我找不到任何好处。原型模式如何有助于在这里快速创建对象。我可以看到该对象每次都必须调用“新”。这是整个程序,如果您认为我没有正确实现原型模式,请纠正我。
抱歉,程序太长了 - 但相信我,这很简单。
就像一个工厂对象——这里是原型类
-- basically an abstract.
class Itransport
{
public:
enum transportPacketType
{
udp,
tcp,
MAX
};
private:
static std::list<Itransport *> prototypesList;
protected:
virtual Itransport::transportPacketType getPacketType() = 0;
virtual Itransport* clone() = 0;
/** This will be called by the derived classes **/
static void registertoPrototypeList(Itransport *packet)
{
prototypesList.push_back(packet);
}
public:
virtual void showMessage() = 0;
static Itransport* makeClone(Itransport::transportPacketType packType)
{
std::list<Itransport *>::iterator it;
for(it = prototypesList.begin(); it != prototypesList.end(); it++)
{
if( (*it)->getPacketType() == packType )
{
return (*it)->clone();
}
}
}
virtual ~Itransport() = 0;
};
Itransport::~Itransport()
{
std::cout<<"Itransport Destructor called"<<std::endl;
}
std::list<Itransport *> Itransport::prototypesList;
这里是Itransport Packet的具体类型——
class udpPacket: public Itransport
{
private:
static udpPacket udpTransportPacket;
protected:
Itransport::transportPacketType getPacketType()
{
return Itransport::udp;
}
Itransport* clone()
{
return new udpPacket();
}
public:
void showMessage()
{
std::cout<<"This is a UDP Packet"<<std::endl;
}
udpPacket()
{
std::cout<<"UDP Packet Constructed"<<std::endl;
registertoPrototypeList(this);
}
~udpPacket()
{
std::cout<<"Destructor of udp called"<<std::endl;
}
};
static udpPacket udpTransportPacket;
这里是客户端 -
int main()
{
Itransport *udpPacket;
Itransport *udpPacket2;
udpPacket = Itransport::makeClone(Itransport::udp);
udpPacket->showMessage();
udpPacket2 = Itransport::makeClone(Itransport::udp);
udpPacket2->showMessage();
delete udpPacket;
delete udpPacket2;
return 0;
}
我在这里找不到与“新”相关的任何好处。请给它一些亮点。
【问题讨论】:
-
应该是
return new udpPacket(*this);而不是return new udpPacket();,因为您想创建原型的副本。
标签: c++ design-patterns