常見設計模式之(九):原型模式

常見設計模式之(九):原型模式

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++的實現過程中主要涉及的技術就是深拷貝和淺拷貝、賦值構造函數、拷貝構造函數,本文暫時不對這些問題進行討論。

參考

《設計模式之禪第二版》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章