//abstractPrototype.h #ifndef __CPROTOTYPE_H__ #define __CPROTOTYPE_H__ 1 class CPrototype { public: virtual ~CPrototype(){} virtual CPrototype* clone() = 0; }; #endif//__CPROTOTYPE_H__
//原型模式的接口文件python
//prototyp.cpp #include <iostream> #include "abstractPrototype.h" using std::string; using std::cout; using std::endl; class CConcretePrototypeA :public CPrototype { public: CConcretePrototypeA(){ } virtual ~CConcretePrototypeA(){ } virtual CPrototype* clone(); public: void setString(const string& str){ strProduct = str; } string getString(){ return strProduct; } private: string strProduct; }; CPrototype* CConcretePrototypeA::clone(){ CConcretePrototypeA* clonePrototype = new CConcretePrototypeA(); clonePrototype->setString(strProduct); return (CPrototype *)clonePrototype; } int main(int argc, char const *argv[]) { CConcretePrototypeA proA; CConcretePrototypeA* proB; proA.setString("it is proA"); proB =(CConcretePrototypeA*) proA.clone(); cout<<proA.getString()<<endl; cout<<proB->getString()<<endl; cout<<"clone"<<endl; proA.setString("it is clone A"); proB->setString("it is clone B"); cout<<proA.getString()<<endl; cout<<proB->getString()<<endl; return 0; }
這邊在理解clone的方法時有點疑問。對於c++來講。返回類型是固定的。在抽象基類定義了clone的接口方法。他的返回值類型也就定義了。子類繼承抽象基類的clone方法。就只是想實現一個可以克隆自身的方法。它應該和子類沒有太大的聯繫,只是提供一個clone的方法。這個方法不太適合c++啊,否則返回值類型會不對啊。ios
python// python已經提供了copy的接口了。c++
copy。prototype
深複製,copy.deepcopy,code
淺複製copy.copy//繼承
class prototype(object): def clone(): return None class concretePrototypeA(prototype): """docstring for concretePrototypeA""" def __init__(self, desc): super(concretePrototypeA, self).__init__() self.desc = desc def clone(self): pro = concretePrototypeA(self.desc) return pro if __name__ == '__main__': creA = concretePrototypeA("concreteprototypeA"); creB = creA.clone(); print creA.desc print creB.desc creA.desc = "clone A" print creA.desc print creB.desc