原型的功能是將一個已經存在的對象作為源目標,其余對象都是通過這個源目標創建。發揮復制的作用就是原型模式的核心思想。
一、源型模式的定義
原型模式是指第二次創建對象可以通過復制已經存在的原型對象來實現,忽略對象創建過程中的其它細節。
?? 核心特點:
-
避免重復初始化操作(尤其是復雜對象)
-
動態添加或刪除產品類
-
隱藏對象創建的細節
其UML類圖如下所示:
類名 | 作用 |
---|---|
Client | 客戶端,通過原型接口克隆對象 |
Prototype | 抽象原型接口,聲明clone() 方法 |
ConcretePrototypeA/B | 具體原型類,實現深拷貝邏輯 |
二、源型模式的適用場景
? 適用場景:
-
對象創建成本高(如數據庫查詢結果、復雜計算對象)
-
需要動態配置的對象(如游戲中的敵人、武器生成)
-
需要避免構造函數的約束(如深拷貝復雜對象)
? 不適用場景:
-
對象結構過于簡單(直接
new
更高效) -
需要強類型控制的場景
2.1、基礎實現
#include <iostream>
#include <memory>// 抽象原型類
class Prototype {
public:virtual ~Prototype() = default;virtual std::unique_ptr<Prototype> clone() const = 0; // 克隆方法virtual void print() const = 0;
};// 具體原型類A
class ConcretePrototypeA : public Prototype {
public:std::unique_ptr<Prototype> clone() const override {return std::make_unique<ConcretePrototypeA>(*this); // 調用拷貝構造}void print() const override {std::cout << "ConcretePrototypeA" << std::endl;}
};// 具體原型類B
class ConcretePrototypeB : public Prototype {
public:std::unique_ptr<Prototype> clone() const override {return std::make_unique<ConcretePrototypeB>(*this);}void print() const override {std::cout << "ConcretePrototypeB" << std::endl;}
};// 客戶端代碼
int main() {std::unique_ptr<Prototype> originalA = std::make_unique<ConcretePrototypeA>();std::unique_ptr<Prototype> cloneA = originalA->clone();cloneA->print(); // 輸出: ConcretePrototypeAstd::unique_ptr<Prototype> originalB = std::make_unique<ConcretePrototy