当前位置: 技术问答>linux和unix
一个简单的问题:什么是“prototype”模式?
来源: 互联网 发布时间:2015-09-18
本文导语: 学习Unix时看到如下一段话: 在给新用户设置磁盘配额时常是在“prototype”模式下,以其他用户的配额设置作模板给新用户设置配额。如“edquota -p proto-user new-user”设置了new-user的配额和proto-user的配额相同。 什么是...
学习Unix时看到如下一段话:
在给新用户设置磁盘配额时常是在“prototype”模式下,以其他用户的配额设置作模板给新用户设置配额。如“edquota -p proto-user new-user”设置了new-user的配额和proto-user的配额相同。
什么是“prototype”模式?
在给新用户设置磁盘配额时常是在“prototype”模式下,以其他用户的配额设置作模板给新用户设置配额。如“edquota -p proto-user new-user”设置了new-user的配额和proto-user的配额相同。
什么是“prototype”模式?
|
设计模式里有原型模式的概念。
比如说,你在用C++开发东东,现在你实现一个函数,传入一个参数-类名,函数返回一个新生成的该类的对像,你想怎么做呢?
传统的作法是
Filter * make_filter_object(const string& name)
{
if (name == "AddFilter) return new AddFilter;
else if (name == "OrFilter) return new OrFilter;
......
}
这样的程序很不好看,但是C++又没有那种创建类对像的机制,那怎么办呢?
Filter是虚基类,给它加一个虚方法Clone,对,克隆。每个子类都重写这个方法以克隆出自己类的对像。再加一个虚方法GetName,取得自己类的名字。
比如Filter * OrFilter::Clone()
{
return new OrFilter(this);
}
string OrFilter::GetName(){return "OrFilter";}
在程序初始化时,把每个类实例化出来一个“原型”,用于创建自己类的对像(通过Clone),因为这些原型的基类型相同所以它们的指针可以存在一个数组里,数组的元素类型为filter。
这样,上面那个创建对像的函数就可以写成:
Filter * make_filter_object(const string& name)
{
for each object "O" in object array
{
if (O->GetName() == name) return O->Clone();
}
}
结合理解一下吧。个人认为原型的精髓就是预先生成特定的对像,用于创建(克隆)同类的对像。
比如说,你在用C++开发东东,现在你实现一个函数,传入一个参数-类名,函数返回一个新生成的该类的对像,你想怎么做呢?
传统的作法是
Filter * make_filter_object(const string& name)
{
if (name == "AddFilter) return new AddFilter;
else if (name == "OrFilter) return new OrFilter;
......
}
这样的程序很不好看,但是C++又没有那种创建类对像的机制,那怎么办呢?
Filter是虚基类,给它加一个虚方法Clone,对,克隆。每个子类都重写这个方法以克隆出自己类的对像。再加一个虚方法GetName,取得自己类的名字。
比如Filter * OrFilter::Clone()
{
return new OrFilter(this);
}
string OrFilter::GetName(){return "OrFilter";}
在程序初始化时,把每个类实例化出来一个“原型”,用于创建自己类的对像(通过Clone),因为这些原型的基类型相同所以它们的指针可以存在一个数组里,数组的元素类型为filter。
这样,上面那个创建对像的函数就可以写成:
Filter * make_filter_object(const string& name)
{
for each object "O" in object array
{
if (O->GetName() == name) return O->Clone();
}
}
结合理解一下吧。个人认为原型的精髓就是预先生成特定的对像,用于创建(克隆)同类的对像。
|
体会设计模式要慢慢来