原型(PROTOTYPE)模式的目的是为了用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
为什么需要原型模式?
我以QT中的QTableWidget 作为例子。如果我们需要对QTableWidget 中项(QTableWidgetItem)进行定制;就需要继承QTableWidgetItem并重写QTableWidgetItem 中的某些方法(QTableWidgetItem::setData),来达到应用程序的目的。
但是这里就有一个问题,QTableWidget为了要创建一个特殊的QTableWidgetItem子对象,就必须要知道这个
子类的名字;对QTableWidget设计者来说,这是不可能的。当然解决的方法有很多,其中使用原型模式可以处理这种问题。在QT 中要求QTableWidgetItem 声明一个virtual 的clone方法。
QTableWidgetItem* QTableWidgetItem::clone() const [virtual]
这个方法的目的是返回一个该类的对象。QTableWidgetItem 的子类就可以重写这个方法,创建一个子类的对象,比如:
QTableWidgetItem* Cell::clone()const
{
return new Cell(*this);
}
这样QTableWidget只要拥有了一个子类化对象,就可以按照需要创建无数的子类化对象。
限制:
这个方法需要被创建的基类有一个虚的clone方法, 子类继承它的时候需要重写这个方法,返回一个子类化的对象。
参考文献:
(1) 设计模式
(2) 13.7 放松覆盖规则,C++语言的设计与演化
(3) C++ GUI programming with Qt4
【注意】现在习惯了将自己学习中获得感想,写出来;文字不流畅或表达不清楚,还请各位看官忍忍。