我在学习设计模式。我是一名C++程序员。目前,我正在玩弄原型模式。我可以将Prototype与工厂类型联系起来。但是,工厂和原型模式之间存在很多差异。例如,在原型模式中,每个派生类都将其原型与基类/超类一起注册。为什么他们说在Proto-type Pattern中 - 只要需要新的对象就可以复制原始对象?
但是,看着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包的具体类型 -
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();'它应该是'return new udpPacket(* this);'因为你想创建一个原型的副本。 – 2014-11-25 21:50:26