我正在学习原型设计模式,并从this article代表sourcemaking的示例中感到困惑。class Stooge{public: virtual void slap_stick() = 0; virtual Stooge* clone() = 0;};class Larry : public Stooge{public: void slap_stick() { cout << "Larry: poke eyes\n"; } Stooge* clone() { return new Larry; }};class Moe : public Stooge{public: void slap_stick() { cout << "Moe: slap head\n"; } Stooge* clone() { return new Moe; }};class Curly : public Stooge{public: void slap_stick() { cout << "Curly: suffer abuse\n"; } Stooge* clone() { return new Curly; }};class Factory{public: static Stooge* make_stooge( int choice );private: static Stooge* s_prototypes[4];};Stooge* Factory::s_prototypes[] = {0, new Larry, new Moe, new Curly};Stooge* Factory::make_stooge( int choice ){ return s_prototypes[choice]->clone();}int main(){ vector roles; int choice; while (true) { cout << "Larry(1) Moe(2) Curly(3) Go(0): "; cin >> choice; if (choice == 0) break; roles.push_back(Factory::make_stooge( choice ) ); } for (int i=0; i < roles.size(); ++i) roles[i]->slap_stick(); for (int i=0; i < roles.size(); ++i) delete roles[i];}根据描述原型设计模式指定要使用原型实例创建的对象的种类,并通过复制此原型来创建新对象。根据this。原型设计模式是一种设计模式,用于通过复制或克隆现有对象的属性来实例化类。据我所知,复制类的常规方法是使用复制构造函数,重载operator =或通过复制现有对象的所有属性来实现克隆函数以实例化新对象。在上面的示例中,我没有看到它如何通过复制原型,复制构造函数,重载operator =或定义的适当克隆函数来实现创建新对象的方式。那么我可以假定这不是原型设计模式的实现吗?还是我的假设是错误的,并且不理解这个例子?编辑:如@ songyuanyao所述 在该示例中,它是在不复制任何内容的情况下新创建新对象因此,我认为上述示例不是原型模式的合适示例,因为它不代表原型模式的主要目标。 最佳答案 首先,不必克隆调用其方法的对象,完全有可能您有Manager或Factory具有用于克隆对象的方法,即:Object Factory::clone( Object &){}另外,确实可以使用复制构造函数,但是复制构造函数的缺点是它仅适用于具体类。如果出于良好的设计决策,仅向用户提供对象API(接口/纯虚拟),则不能在客户端使用复制构造函数,因此,如果预期的用途是克隆项目,则可以通过添加方法class BaseVirtualClass{public: virtual int foo() = 0; virtual BaseVirtualClass * clone() = 0; virtual ~BaseVirtualClass(){}};class DerivedClass: public BaseVirtualClass{ int state;public: DerivedClass(int a):state(a){} DerivedClass( const DerivedClass & other) : state(other.state){} int foo(){ // override return state; } BaseVirtualClass * clone(){ //override // I'm using copy constructor here, but hidden from user return new DerivedClass( *this); }};用法:BaseVirtualClass * obj = factory.createObject();BaseVirtualClass * clone = obj->clone();有时您也想通过工厂做到这一点:BaseVirtualClass * obj = factory.createObject();BaseVirtualClass * clone = factory.clone(obj);注意:除了仅提供指向抽象类的指针时,修复丢失的副本构造函数之外,Clone方法具有明确的意图来复制创建Deep Copy的对象状态,而无需编写样板代码来重新创建对象在那个特定状态。当创建对象的责任不属于对象时(因为您必须使用带有自定义分配器或其他复杂依赖项的工厂),则将克隆方法移至工厂。编辑:在我看来,发问者在互联网上发现的代码示例对我来说是一个极端的情况。从技术上讲,这些对象是克隆体(它们没有状态,除了类型之外,因此它们具有相同的状态),但是我发现这并不是原型模式的一个很好的例子:当需要以某种方式复制具有有趣状态的复杂对象时,我想使用原型模式。最重要的部分是状态的复制,因此内部实现也应对此明确(对于内部文档目的,将具有相同状态的对象保留为隐式可能不清楚)关于design-patterns - 原型(prototype)设计模式示例(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33142935/ 10-10 16:33