我正在学习原型设计模式,并对 sourcemaking 上的 this article 中给出的示例感到困惑。
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];
}
根据原型设计模式的描述:
- 使用原型实例指定要创建的对象类型,并通过复制该原型创建新对象。
据我所知,复制类的常规方式是使用复制构造函数、重载运算符=或实现克隆函数来通过复制现有对象的所有属性来实例化一个新对象。
在上面的例子中,我没有看到它如何通过复制原型来创建新对象,既没有定义复制构造函数,也没有重载运算符=或适当的克隆函数。
那么我可以认为这不是原型设计模式的实现吗?还是我对我的假设理解错误? 编辑:如@songyuanyao所提到的
在这个例子中,它是新创建的对象,没有复制任何东西
所以我认为上述例子不是原型模式的合适示例,因为它并没有代表原型模式的主要目标。
return new Larry(*this);
。 - songyuanyao