prototype原型模式
用原型執行個體指定建立對象的種類,並且通過拷貝這個原型來建立新的對象。
小demo
prototype.h
#ifndef PROTOTYPE_H#define PROTOTYPE_H// 虛擬基類,所有原型的基類,提供Clone介面函數class Prototype{public:Prototype(){}virtual ~Prototype(){}virtual Prototype* Clone() = 0;};// 派生自Prototype,實現Clone方法class ConcreatePrototype1 : public Prototype{public:ConcreatePrototype1();ConcreatePrototype1(const ConcreatePrototype1& cp);virtual ~ConcreatePrototype1();virtual Prototype* Clone();};// 派生自Prototype,實現Clone方法class ConcreatePrototype2 : public Prototype{public:ConcreatePrototype2();ConcreatePrototype2(const ConcreatePrototype2& cp);virtual ~ConcreatePrototype2();virtual Prototype* Clone();};#endif
prototype.cpp
#include "Prototype.h"#include <iostream>ConcreatePrototype1::ConcreatePrototype1(){std::cout << "construction of ConcreatePrototype1\n";}ConcreatePrototype1::~ConcreatePrototype1(){std::cout << "destruction of ConcreatePrototype1\n";}ConcreatePrototype1::ConcreatePrototype1(const ConcreatePrototype1& cp){std::cout << "copy construction of ConcreatePrototype1\n";}Prototype* ConcreatePrototype1::Clone(){return new ConcreatePrototype1(*this);}ConcreatePrototype2::ConcreatePrototype2(){std::cout << "construction of ConcreatePrototype2\n";}ConcreatePrototype2::~ConcreatePrototype2(){std::cout << "destruction of ConcreatePrototype2\n";}ConcreatePrototype2::ConcreatePrototype2(const ConcreatePrototype2& cp){std::cout << "copy construction of ConcreatePrototype2\n";}Prototype* ConcreatePrototype2::Clone(){return new ConcreatePrototype2(*this);}
main.cpp
#include "Prototype.h"#include <stdlib.h>int main(){Prototype* pPrototype1 = new ConcreatePrototype1();Prototype* pPrototype2 = pPrototype1->Clone();Prototype* pPrototype3 = new ConcreatePrototype2();Prototype* pPrototype4 = pPrototype3->Clone();delete pPrototype1;delete pPrototype2;delete pPrototype3;delete pPrototype4;system("pause");return 0;}
Prototype模式的結構和實現都很簡單,其關鍵就是C++中拷貝建構函式的實現方式,這也是C++實現技術層面上的事情。在C++中拷貝建構函式曾經是很多程式員的噩夢,淺層拷貝(在位拷貝)和深層拷貝(主要指有指標,綜合物件的情況)的魔魘也是很多程式員在面試時候的快餐盒系統崩潰時候的根源之一。
Prototype模式通過複製原型(prototype)而獲得新對象建立的功能,這裡prototype本身就是“對象工廠”(因為能夠生產對象),實際上prototype模式和Builder模式,AbstractFactory模式都是通過一個類(對象執行個體)來專門負責對象的建立工作(工廠對象),它們之間的區別是:Builder模式重在複雜物件的一步步建立(並不直接返回對象),AbstractFactory模式重在生產多個相互依賴類的對象,而prototype模式重在從自身負責自己建立新類。