设计模式之Prototype(原型)
原文:http://www.vincehuston.org/dp/prototype.html
定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
1. 在基类接口中定义一个clone()方法,并在每一个派生类中实现这个方法。
2. 每一个实现都通过封装”new”操作并返回自己的实例。
3. 客户端委托给原型对象来创建对象。
/
A clone() method has been added to the Stooge
// hierarchy. Each derived class implements that
// method by returning an instance of itself. A
// Factory class has been introduced that main-
// tains a suite of "breeder" objects (aka proto-
// types), and knows how to delegate to the
// correct prototype.
class Stooge {
public:
virtual Stooge* clone() = 0;
virtual void slap_stick() = 0;
} ;
class Factory {
public:
static Stooge* make_stooge( int choice );
private:
static Stooge* s_prototypes[4];
} ;
int main( void ) {
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];
}
class Larry : public Stooge {
public:
Stooge* clone() { return new Larry; }
void slap_stick() {
cout << "Larry: poke eyes "; }
} ;
class Moe : public Stooge {
public:
Stooge* clone() { return new Moe; }
void slap_stick() {
cout << "Moe: slap head "; }
} ;
class Curly : public Stooge {
public:
Stooge* clone() { return new Curly; }
void slap_stick() {
cout << "Curly: suffer abuse "; }
} ;
Stooge * Factory::s_prototypes[] = {
0, new Larry, new Moe, new Curly
} ;
Stooge * Factory::make_stooge( int choice ) {
return s_prototypes[choice]->clone();
}
// hierarchy. Each derived class implements that
// method by returning an instance of itself. A
// Factory class has been introduced that main-
// tains a suite of "breeder" objects (aka proto-
// types), and knows how to delegate to the
// correct prototype.
class Stooge {
public:
virtual Stooge* clone() = 0;
virtual void slap_stick() = 0;
} ;
class Factory {
public:
static Stooge* make_stooge( int choice );
private:
static Stooge* s_prototypes[4];
} ;
int main( void ) {
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];
}
class Larry : public Stooge {
public:
Stooge* clone() { return new Larry; }
void slap_stick() {
cout << "Larry: poke eyes "; }
} ;
class Moe : public Stooge {
public:
Stooge* clone() { return new Moe; }
void slap_stick() {
cout << "Moe: slap head "; }
} ;
class Curly : public Stooge {
public:
Stooge* clone() { return new Curly; }
void slap_stick() {
cout << "Curly: suffer abuse "; }
} ;
Stooge * Factory::s_prototypes[] = {
0, new Larry, new Moe, new Curly
} ;
Stooge * Factory::make_stooge( int choice ) {
return s_prototypes[choice]->clone();
}
1.Composite and Decorator patterns都得益于原型模式。
2.当对象初始化时会花费更多代价的时候,原型是很有用的,你会在初始化参数中使用很少的变量
。在此背景下,原型会避免“从0开始创建“这种昂贵的代价,并支持廉价克隆一个预初始化原型。
3.相对于其他模式,原型模式是独一无二的,它并不需要一个类,只需要一个对象。就像oo语言一样,Omega打破了类完全依靠原型来创建对象。