文章目錄
常見設計模式之(九):原型模式
1 什麼是原型模式(Prototype pattern)?
摘自 java 設計模式官網 中 有關原型模式的定義:
Specify the kinds of objects to create using a prototypical instance,and create new objects by
copying this prototype
翻譯一下:
用原型實例指定創建對象的種類, 並且通過拷貝這些原型創建新的對象。
2 c++實現
2.1 通用類圖
2.2 c++實現
AbstractPrototype.h
#ifndef ABSTRACT_PROTOTYPE_H
#define ABSTRACT_PROTOTYPE_H
class AbstractPrototype
{
public:
AbstractPrototype()
{
}
virtual ~AbstractPrototype()
{
}
virtual AbstractPrototype * Clone(void) = 0;
};
#endif
ConcretePrototype.cpp
#ifndef CONCRETE_PROTOTYPE_H
#define CONCRETE_PROTOTYPE_H
#include <iostream>
#include "AbstarctPrototype.h"
class ConcretePrototype : public AbstractPrototype
{
public:
ConcretePrototype()
{
}
virtual ~ConcretePrototype()
{
}
//複製自身
virtual ConcretePrototype * Clone()
{
//調用拷貝構造函數
return new ConcretePrototype(*this);
}
private:
//拷貝構造函數 應該 區分深拷貝和淺拷貝
ConcretePrototype(const ConcretePrototype & rproto)
{
m_test1 = rproto.m_test1;
std::cout<<"克隆中。。。。"<<std::endl;
}
ConcretePrototype & operator=(const ConcretePrototype &);
int m_test1;
};
#endif
ClientPrototype.cpp
#include "AbstarctPrototype.h"
#include "ConcretePrototype.h"
int main(void)
{
AbstractPrototype * cls_proto = new ConcretePrototype();
AbstractPrototype * cls_concrete = cls_proto->Clone();
delete cls_concrete;
delete cls_proto;
}
編譯並運行:
root@wan:/wan/09Prototype# make ClientPrototype
g++ ClientPrototype.cpp -o ClientPrototype
root@wan:/wan/09Prototype# ./ClientPrototype
克隆中。。。。
3 總結
3.1 原型模式的優缺點
- 性能優良
原型模式是在內存二進制流的拷貝, 要比直接new一個對象性能好很多, 特別是要在一個循環體內產生大量的對象時, 原型模式可以更好地體現其優點。 - 逃避構造函數的約束
這既是它的優點也是缺點, 直接在內存中拷貝, 構造函數是不會執行的優點就是減少了約束, 缺點也是減少了約束, 需要大家在實際應用時考慮。
3.2 原型模式的使用場景
- 資源優化場景
類初始化需要消化非常多的資源, 這個資源包括數據、 硬件資源等。 - 性能和安全要求的場景
通過new產生一個對象需要非常繁瑣的數據準備或訪問權限, 則可以使用原型模式。 - 一個對象多個修改者的場景
一個對象需要提供給其他對象訪問, 而且各個調用者可能都需要修改其值時, 可以考慮使用原型模式拷貝多個對象供調用者使用。
3.3 與建造者模式、工廠模式的區別
Prototype 模式通過複製原型(Prototype)而獲得新對象創建的功能,這裏 Prototype 本身就是“對象工廠”(因爲能夠生產對象), 實際上 Prototype 模式和 Builder 模式、AbstractFactory 模式都是通過一個類(對象實例) 來專門負責對象的創建工作(工廠對象),它們之間的區別是: Builder 模式重在複雜對象的一步步創建(並不直接返回對象),AbstractFactory 模式重在產生多個相互依賴類的對象,而 Prototype 模式重在從自身複製自己創建新類。
4 題外話
原型模式在c++的實現過程中主要涉及的技術就是深拷貝和淺拷貝、賦值構造函數、拷貝構造函數,本文暫時不對這些問題進行討論。
參考
《設計模式之禪第二版》