设计模式(C++)详解—原型模式(3)

<摘要>

原型模式是一种创建型设计模式,通过克隆已有对象来创建新对象,避免了直接使用构造函数带来的性能开销和复杂性。本文从背景概念、设计意图、应用场景、代码实现等维度全面解析该模式,重点探讨了C++中深拷贝与浅拷贝的核心问题,通过文档编辑、游戏开发、配置模板三个典型案例展示实际应用,并提供完整的代码实现与可视化图表。


<解析>

1. 背景与核心概念

1.1 起源与发展

原型模式最早出现在1977年Christopher Alexander的建筑学著作《A Pattern Language》中,后被软件工程界引入。在GoF 1994年的《设计模式》中被正式定义为创建型模式,其核心思想是通过复制现有对象(原型)来创建新对象,而不是通过new关键字实例化。

1.2 核心概念解析

原型(Prototype) :一个接口或抽象类,声明了克隆自身的方法
具体原型(Concrete Prototype) :实现克隆方法的具体类
客户端(Client):通过请求原型对象克隆自己来创建新对象
<<interface>> Prototype +clone() : Prototype ConcretePrototype -field: type +clone() : Prototype +getField() : type +setField(type) : void Client -prototype: Prototype +operation() : void

1.3 现状与趋势

在现代软件开发中,原型模式的应用越来越广泛:

  • 在游戏开发中用于快速创建相似游戏对象
  • 在配置管理中用于创建配置模板
  • 在大型对象创建成本高的场景中替代new操作
  • 与工厂模式结合形成原型工厂模式

2. 设计意图与考量

2.1 核心设计目标

原型模式主要解决以下问题:

  1. 避免创建成本高的对象:当直接创建对象的成本较高时(如需要复杂计算或资源访问)
  2. 避免复杂的构造过程:当对象构造需要复杂初始化或许多参数时
  3. 隔离具体类:客户端不需要知道具体类名,只需知道原型接口
  4. 动态配置应用:运行时动态指定要实例化的类

2.2 关键权衡因素

考量因素 使用原型模式 不使用原型模式
对象创建成本 高成本时优势明显 低成本时不值得
对象复杂性 复杂对象适合 简单对象不必要
系统灵活性 需要高灵活性时 固定结构时
克隆实现难度 容易实现克隆 难以实现克隆

2.3 深拷贝与浅拷贝的抉择

这是原型模式在C++中的核心问题:

浅拷贝:只复制指针,不复制指针指向的内容

  • 优点:速度快,内存占用少
  • 缺点:对象间共享数据,修改一个会影响另一个

深拷贝:复制指针及其指向的内容

  • 优点:对象完全独立,互不影响
  • 缺点:速度慢,内存占用多

原型对象 选择拷贝方式 浅拷贝 深拷贝 共享数据 独立数据 修改相互影响 修改互不影响

3. 实例与应用场景

3.1 案例一:文档编辑器中的图形对象

应用场景:文档编辑器中用户需要频繁创建相似但略有不同的图形对象(圆形、矩形等)

实现流程

  1. 定义图形抽象基类,声明纯虚克隆方法
  2. 为每种图形实现具体类并重写克隆方法
  3. 维护一个原型管理器存储各种图形原型
  4. 用户需要新图形时,从管理器获取原型并克隆
cpp 复制代码
// 图形抽象类
class Graphic {
public:
    virtual ~Graphic() = default;
    virtual Graphic* clone() const = 0;
    virtual void draw() const = 0;
    virtual void setPosition(int x, int y) = 0;
};

// 具体圆形类
class Circle : public Graphic {
private:
    int x, y;
    int radius;
    std::string color;
    
public:
    Circle(int x, int y, int r, const std::string& color) 
        : x(x), y(y), radius(r), color(color) {}
    
    Graphic* clone() const override {
        return new Circle(*this); // 调用拷贝构造函数
    }
    
    void draw() const override {
        std::cout << "绘制圆形 at (" << x << "," << y 
                  << ") with radius " << radius 
                  << " and color " << color << std::endl;
    }
    
    void setPosition(int x, int y) override {
        this->x = x;
        this->y = y;
    }
    
    void setRadius(int r) { radius = r; }
};

// 原型管理器
class PrototypeManager {
private:
    std::unordered_map<std::string, Graphic*> prototypes;
    
public:
    ~PrototypeManager() {
        for (auto& pair : prototypes) {
            delete pair.second;
        }
    }
    
    void registerPrototype(const std::string& key, Graphic* proto) {
        prototypes[key] = proto;
    }
    
    Graphic* createGraphic(const std::string& key) {
        auto it = prototypes.find(key);
        if (it != prototypes.end()) {
            return it->second->clone();
        }
        return nullptr;
    }
};

// 使用示例
int main() {
    PrototypeManager manager;
    
    // 注册原型
    manager.registerPrototype("red_circle", new Circle(0, 0, 10, "red"));
    manager.registerPrototype("blue_circle", new Circle(0, 0, 15, "blue"));
    
    // 通过克隆创建新对象
    Graphic* circle1 = manager.createGraphic("red_circle");
    Graphic* circle2 = manager.createGraphic("blue_circle");
    
    circle1->setPosition(10, 20);
    circle2->setPosition(30, 40);
    
    circle1->draw();
    circle2->draw();
    
    delete circle1;
    delete circle2;
    
    return 0;
}

3.2 案例二:游戏开发中的敌人角色

应用场景:游戏中需要快速创建大量相似但具有细微差别的敌人角色

实现流程

  1. 定义敌人基类,包含基本属性和克隆方法
  2. 实现具体敌人类型(兽人、精灵、怪物等)
  3. 使用原型管理器存储各种敌人原型
  4. 游戏需要生成敌人时,从管理器克隆原型并微调属性
cpp 复制代码
#include <iostream>
#include <string>
#include <unordered_map>
#include <memory>

// 敌人抽象类
class Enemy {
public:
    virtual ~Enemy() = default;
    virtual std::unique_ptr<Enemy> clone() const = 0;
    virtual void display() const = 0;
    virtual void setHealth(int health) = 0;
    virtual void setPosition(float x, float y) = 0;
};

// 具体敌人类 - 兽人
class Orc : public Enemy {
private:
    int health;
    float positionX, positionY;
    std::string weapon;
    int speed;
    
public:
    Orc(int health, const std::string& weapon, int speed)
        : health(health), weapon(weapon), speed(speed), positionX(0), positionY(0) {}
    
    std::unique_ptr<Enemy> clone() const override {
        return std::make_unique<Orc>(*this);
    }
    
    void display() const override {
        std::cout << "兽人敌人: 生命值=" << health 
                  << ", 武器=" << weapon 
                  << ", 速度=" << speed
                  << ", 位置=(" << positionX << "," << positionY << ")" << std::endl;
    }
    
    void setHealth(int health) override { this->health = health; }
    void setPosition(float x, float y) override { positionX = x; positionY = y; }
    
    // 兽人特有方法
    void setWeapon(const std::string& newWeapon) { weapon = newWeapon; }
};

// 具体敌人类 - 精灵
class Elf : public Enemy {
private:
    int health;
    float positionX, positionY;
    int magicPower;
    std::string spell;
    
public:
    Elf(int health, int magicPower, const std::string& spell)
        : health(health), magicPower(magicPower), spell(spell), positionX(0), positionY(0) {}
    
    std::unique_ptr<Enemy> clone() const override {
        return std::make_unique<Elf>(*this);
    }
    
    void display() const override {
        std::cout << "精灵敌人: 生命值=" << health 
                  << ", 魔法力量=" << magicPower 
                  << ", 法术=" << spell
                  << ", 位置=(" << positionX << "," << positionY << ")" << std::endl;
    }
    
    void setHealth(int health) override { this->health = health; }
    void setPosition(float x, float y) override { positionX = x; positionY = y; }
    
    // 精灵特有方法
    void setSpell(const std::string& newSpell) { spell = newSpell; }
};

// 敌人工厂/管理器
class EnemyFactory {
private:
    std::unordered_map<std::string, std::unique_ptr<Enemy>> prototypes;
    
public:
    void registerPrototype(const std::string& key, std::unique_ptr<Enemy> proto) {
        prototypes[key] = std::move(proto);
    }
    
    std::unique_ptr<Enemy> createEnemy(const std::string& key) {
        auto it = prototypes.find(key);
        if (it != prototypes.end()) {
            return it->second->clone();
        }
        return nullptr;
    }
};

// 使用示例
int main() {
    EnemyFactory factory;
    
    // 注册各种敌人原型
    factory.registerPrototype("basic_orc", std::make_unique<Orc>(100, "战斧", 5));
    factory.registerPrototype("strong_orc", std::make_unique<Orc>(150, "巨锤", 3));
    factory.registerPrototype("elf_archer", std::make_unique<Elf>(80, 50, "冰冻箭"));
    factory.registerPrototype("elf_mage", std::make_unique<Elf>(60, 100, "火球术"));
    
    // 创建敌人队伍
    std::cout << "创建敌人队伍:" << std::endl;
    
    auto enemy1 = factory.createEnemy("basic_orc");
    auto enemy2 = factory.createEnemy("strong_orc");
    auto enemy3 = factory.createEnemy("elf_archer");
    auto enemy4 = factory.createEnemy("elf_mage");
    
    // 设置不同位置
    enemy1->setPosition(10.0f, 20.0f);
    enemy2->setPosition(30.0f, 40.0f);
    enemy3->setPosition(15.0f, 25.0f);
    enemy4->setPosition(35.0f, 45.0f);
    
    // 显示敌人信息
    enemy1->display();
    enemy2->display();
    enemy3->display();
    enemy4->display();
    
    return 0;
}

3.3 案例三:配置模板管理系统

应用场景:系统需要多种配置模板,用户基于模板创建个性化配置

实现流程

  1. 定义配置类,包含各种配置参数和克隆方法
  2. 创建不同用途的配置模板(数据库配置、网络配置等)
  3. 用户选择模板后克隆并修改特定参数
  4. 确保模板的安全性和独立性
cpp 复制代码
#include <iostream>
#include <string>
#include <unordered_map>
#include <memory>
#include <vector>

// 配置类
class Configuration {
private:
    std::string configName;
    std::unordered_map<std::string, std::string> settings;
    std::vector<std::string> dependencies;
    
public:
    Configuration(const std::string& name) : configName(name) {}
    
    // 拷贝构造函数 - 实现深拷贝
    Configuration(const Configuration& other)
        : configName(other.configName), 
          settings(other.settings),
          dependencies(other.dependencies) {
    }
    
    // 克隆方法
    std::unique_ptr<Configuration> clone() const {
        return std::make_unique<Configuration>(*this);
    }
    
    void setSetting(const std::string& key, const std::string& value) {
        settings[key] = value;
    }
    
    std::string getSetting(const std::string& key) const {
        auto it = settings.find(key);
        if (it != settings.end()) {
            return it->second;
        }
        return "";
    }
    
    void addDependency(const std::string& dependency) {
        dependencies.push_back(dependency);
    }
    
    void display() const {
        std::cout << "配置: " << configName << std::endl;
        std::cout << "设置:" << std::endl;
        for (const auto& setting : settings) {
            std::cout << "  " << setting.first << " = " << setting.second << std::endl;
        }
        std::cout << "依赖:" << std::endl;
        for (const auto& dep : dependencies) {
            std::cout << "  " << dep << std::endl;
        }
        std::cout << std::endl;
    }
};

// 配置管理器
class ConfigManager {
private:
    std::unordered_map<std::string, std::unique_ptr<Configuration>> templates;
    
public:
    void registerTemplate(const std::string& name, std::unique_ptr<Configuration> config) {
        templates[name] = std::move(config);
    }
    
    std::unique_ptr<Configuration> createConfig(const std::string& templateName) {
        auto it = templates.find(templateName);
        if (it != templates.end()) {
            return it->second->clone();
        }
        return nullptr;
    }
};

// 使用示例
int main() {
    ConfigManager manager;
    
    // 创建并注册数据库配置模板
    auto dbConfig = std::make_unique<Configuration>("数据库配置模板");
    dbConfig->setSetting("host", "localhost");
    dbConfig->setSetting("port", "3306");
    dbConfig->setSetting("username", "admin");
    dbConfig->setSetting("password", "secret");
    dbConfig->addDependency("mysql-client");
    dbConfig->addDependency("connection-pool");
    manager.registerTemplate("database", std::move(dbConfig));
    
    // 创建并注册网络配置模板
    auto netConfig = std::make_unique<Configuration>("网络配置模板");
    netConfig->setSetting("ip", "192.168.1.1");
    netConfig->setSetting("subnet", "255.255.255.0");
    netConfig->setSetting("gateway", "192.168.1.254");
    netConfig->setSetting("dns", "8.8.8.8");
    netConfig->addDependency("network-manager");
    manager.registerTemplate("network", std::move(netConfig));
    
    // 用户基于模板创建个性化配置
    std::cout << "基于模板创建配置:" << std::endl;
    
    auto myDbConfig = manager.createConfig("database");
    auto myNetConfig = manager.createConfig("network");
    
    // 修改个性化设置
    myDbConfig->setSetting("username", "myuser");
    myDbConfig->setSetting("password", "mypassword");
    
    myNetConfig->setSetting("ip", "192.168.1.100");
    
    // 显示配置
    std::cout << "模板配置:" << std::endl;
    manager.createConfig("database")->display();
    manager.createConfig("network")->display();
    
    std::cout << "个性化配置:" << std::endl;
    myDbConfig->display();
    myNetConfig->display();
    
    return 0;
}

4. 代码实现与编译运行

4.1 完整代码实现(以游戏敌人为例)

以下是完整的游戏敌人原型模式实现,包含深拷贝处理:

cpp 复制代码
#include <iostream>
#include <string>
#include <unordered_map>
#include <memory>
#include <vector>

// 武器类 - 需要深拷贝
class Weapon {
private:
    std::string name;
    int damage;
    float weight;
    
public:
    Weapon(const std::string& name, int damage, float weight)
        : name(name), damage(damage), weight(weight) {}
    
    // 拷贝构造函数
    Weapon(const Weapon& other) 
        : name(other.name), damage(other.damage), weight(other.weight) {
        std::cout << "深拷贝武器: " << name << std::endl;
    }
    
    std::string getName() const { return name; }
    int getDamage() const { return damage; }
    float getWeight() const { return weight; }
    
    void setName(const std::string& newName) { name = newName; }
    void setDamage(int newDamage) { damage = newDamage; }
    
    void display() const {
        std::cout << "武器: " << name << " (伤害: " << damage << ", 重量: " << weight << ")";
    }
};

// 敌人抽象类
class Enemy {
public:
    virtual ~Enemy() = default;
    virtual std::unique_ptr<Enemy> clone() const = 0;
    virtual void display() const = 0;
    virtual void setPosition(float x, float y) = 0;
    virtual void setHealth(int health) = 0;
};

// 具体敌人类
class Monster : public Enemy {
private:
    std::string type;
    int health;
    float positionX, positionY;
    std::unique_ptr<Weapon> weapon; // 需要深拷贝的成员
    std::vector<std::string> abilities; // 需要深拷贝的成员
    
public:
    Monster(const std::string& type, int health, 
            std::unique_ptr<Weapon> weapon, 
            const std::vector<std::string>& abilities)
        : type(type), health(health), positionX(0), positionY(0),
          weapon(std::move(weapon)), abilities(abilities) {}
    
    // 拷贝构造函数 - 实现深拷贝
    Monster(const Monster& other)
        : type(other.type), 
          health(other.health),
          positionX(other.positionX),
          positionY(other.positionY),
          abilities(other.abilities) { // vector的拷贝构造函数实现深拷贝
          
        // 深拷贝武器
        if (other.weapon) {
            weapon = std::make_unique<Weapon>(*other.weapon);
        }
    }
    
    std::unique_ptr<Enemy> clone() const override {
        return std::make_unique<Monster>(*this);
    }
    
    void display() const override {
        std::cout << type << " - 生命值: " << health 
                  << ", 位置: (" << positionX << ", " << positionY << ")" << std::endl;
        
        if (weapon) {
            std::cout << "  ";
            weapon->display();
            std::cout << std::endl;
        }
        
        if (!abilities.empty()) {
            std::cout << "  能力: ";
            for (size_t i = 0; i < abilities.size(); ++i) {
                if (i > 0) std::cout << ", ";
                std::cout << abilities[i];
            }
            std::cout << std::endl;
        }
    }
    
    void setPosition(float x, float y) override {
        positionX = x;
        positionY = y;
    }
    
    void setHealth(int health) override {
        this->health = health;
    }
    
    // 修改武器名称(测试深拷贝)
    void customizeWeapon(const std::string& newName) {
        if (weapon) {
            weapon->setName(newName);
        }
    }
};

// 敌人工厂
class EnemyFactory {
private:
    std::unordered_map<std::string, std::unique_ptr<Enemy>> prototypes;
    
public:
    void registerPrototype(const std::string& key, std::unique_ptr<Enemy> proto) {
        prototypes[key] = std::move(proto);
    }
    
    std::unique_ptr<Enemy> createEnemy(const std::string& key) {
        auto it = prototypes.find(key);
        if (it != prototypes.end()) {
            return it->second->clone();
        }
        return nullptr;
    }
};

int main() {
    EnemyFactory factory;
    
    // 创建原型武器和能力
    auto dragonWeapon = std::make_unique<Weapon>("龙息", 50, 0.0f);
    std::vector<std::string> dragonAbilities = {"飞行", "喷火", "恐惧光环"};
    
    auto orcWeapon = std::make_unique<Weapon>("巨斧", 30, 15.0f);
    std::vector<std::string> orcAbilities = {"狂暴", "击退"};
    
    // 注册原型
    factory.registerPrototype("dragon", 
        std::make_unique<Monster>("巨龙", 200, std::move(dragonWeapon), dragonAbilities));
    
    factory.registerPrototype("orc", 
        std::make_unique<Monster>("兽人", 100, std::move(orcWeapon), orcAbilities));
    
    // 克隆并定制敌人
    std::cout << "=== 原型敌人 ===" << std::endl;
    auto protoDragon = factory.createEnemy("dragon");
    auto protoOrc = factory.createEnemy("orc");
    
    protoDragon->setPosition(100.0f, 200.0f);
    protoOrc->setPosition(50.0f, 75.0f);
    
    protoDragon->display();
    protoOrc->display();
    
    std::cout << "\n=== 定制敌人 ===" << std::endl;
    
    // 创建多个定制敌人
    for (int i = 1; i <= 3; ++i) {
        auto dragon = factory.createEnemy("dragon");
        auto orc = factory.createEnemy("orc");
        
        dragon->setPosition(10.0f * i, 20.0f * i);
        orc->setPosition(5.0f * i, 7.5f * i);
        
        // 向下转换以调用特定方法(在实际项目中应使用更安全的方式)
        Monster* monsterPtr = dynamic_cast<Monster*>(dragon.get());
        if (monsterPtr) {
            monsterPtr->customizeWeapon("定制龙息 #" + std::to_string(i));
        }
        
        std::cout << "--- 敌人组 #" << i << " ---" << std::endl;
        dragon->display();
        orc->display();
    }
    
    // 验证原型未被修改
    std::cout << "\n=== 验证原型未被修改 ===" << std::endl;
    protoDragon->display();
    
    return 0;
}

4.2 Makefile 范例

makefile 复制代码
# 编译器设置
CXX := g++
CXXFLAGS := -std=c++17 -Wall -Wextra -O2

# 目标文件
TARGET := prototype_demo
SRCS := prototype_demo.cpp
OBJS := $(SRCS:.cpp=.o)

# 默认目标
all: $(TARGET)

# 链接目标
$(TARGET): $(OBJS)
	$(CXX) $(CXXFLAGS) -o $@ $^

# 编译源文件
%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

# 清理
clean:
	rm -f $(TARGET) $(OBJS)

# 运行
run: $(TARGET)
	./$(TARGET)

# 调试版本
debug: CXXFLAGS += -g
debug: $(TARGET)

.PHONY: all clean run debug

4.3 编译与运行方法

编译方法:

bash 复制代码
# 方式一:直接使用g++编译
g++ -std=c++17 -Wall -Wextra -O2 prototype_demo.cpp -o prototype_demo

# 方式二:使用提供的Makefile
make        # 编译发布版本
make debug  # 编译调试版本
make clean  # 清理生成的文件

运行方式:

bash 复制代码
./prototype_demo

预期输出结果:

复制代码
深拷贝武器: 龙息
深拷贝武器: 巨斧
=== 原型敌人 ===
深拷贝武器: 龙息
深拷贝武器: 巨斧
巨龙 - 生命值: 200, 位置: (100, 200)
  武器: 龙息 (伤害: 50, 重量: 0)
  能力: 飞行, 喷火, 恐惧光环
兽人 - 生命值: 100, 位置: (50, 75)
  武器: 巨斧 (伤害: 30, 重量: 15)
  能力: 狂暴, 击退

=== 定制敌人 ===
深拷贝武器: 龙息
深拷贝武器: 巨斧
--- 敌人组 #1 ---
巨龙 - 生命值: 200, 位置: (10, 20)
  武器: 定制龙息 #1 (伤害: 50, 重量: 0)
  能力: 飞行, 喷火, 恐惧光环
兽人 - 生命值: 100, 位置: (5, 7.5)
  武器: 巨斧 (伤害: 30, 重量: 15)
  能力: 狂暴, 击退
深拷贝武器: 龙息
深拷贝武器: 巨斧
--- 敌人组 #2 ---
巨龙 - 生命值: 200, 位置: (20, 40)
  武器: 定制龙息 #2 (伤害: 50, 重量: 0)
  能力: 飞行, 喷火, 恐惧光环
兽人 - 生命值: 100, 位置: (10, 15)
  武器: 巨斧 (伤害: 30, 重量: 15)
  能力: 狂暴, 击退
深拷贝武器: 龙息
深拷贝武器: 巨斧
--- 敌人组 #3 ---
巨龙 - 生命值: 200, 位置: (30, 60)
  武器: 定制龙息 #3 (伤害: 50, 重量: 0)
  能力: 飞行, 喷火, 恐惧光环
兽人 - 生命值: 100, 位置: (15, 22.5)
  武器: 巨斧 (伤害: 30, 重量: 15)
  能力: 狂暴, 击退

=== 验证原型未被修改 ===
巨龙 - 生命值: 200, 位置: (100, 200)
  武器: 龙息 (伤害: 50, 重量: 0)
  能力: 飞行, 喷火, 恐惧光环

4.4 时序图说明

Client Factory Prototype ConcretePrototype registerPrototype("dragon", proto) 存储原型对象 createEnemy("dragon") clone() 调用拷贝构造函数 深拷贝所有成员数据 返回克隆对象 返回克隆对象 返回新敌人实例 setPosition()/customize() 修改对象状态 Client Factory Prototype ConcretePrototype

5. 交互性内容解析

在分布式系统或需要网络通信的场景中,原型模式可以与其他模式结合使用:

5.1 原型模式与序列化

当需要在网络上传输对象时,可以将原型模式与序列化结合:

cpp 复制代码
// 可序列化的原型接口
class SerializablePrototype : public Enemy {
public:
    virtual std::string serialize() const = 0;
    virtual void deserialize(const std::string& data) = 0;
};

// 网络管理器
class NetworkManager {
public:
    std::unique_ptr<Enemy> receiveEnemyFromNetwork() {
        // 接收序列化数据
        std::string data = receiveData();
        
        // 根据数据类型选择原型
        std::string type = parseType(data);
        auto prototype = getPrototype(type);
        
        // 反序列化
        auto enemy = prototype->clone();
        auto serializable = dynamic_cast<SerializablePrototype*>(enemy.get());
        if (serializable) {
            serializable->deserialize(data);
        }
        
        return enemy;
    }
    
    void sendEnemyToNetwork(const Enemy& enemy) {
        auto serializable = dynamic_cast<const SerializablePrototype*>(&enemy);
        if (serializable) {
            std::string data = serializable->serialize();
            sendData(data);
        }
    }
};

5.2 通信报文结构

使用原型模式时,网络通信的报文可能包含:

复制代码
+----------------+----------------+-----------------------+
|  对象类型(4B)  |  数据长度(4B)  |  序列化数据(变长)     |
+----------------+----------------+-----------------------+

这种结构允许接收方:

  1. 根据对象类型选择正确的原型
  2. 克隆原型对象
  3. 用接收到的数据初始化克隆对象

6. 总结与最佳实践

原型模式在C++中的实现需要特别注意深拷贝与浅拷贝的问题。以下是一些最佳实践:

  1. 明确拷贝语义:在设计类时,明确指定是需要深拷贝还是浅拷贝
  2. 使用智能指针 :使用std::unique_ptrstd::shared_ptr管理资源所有权
  3. 实现拷贝构造函数和赋值运算符:对于需要深拷贝的类,正确实现这些方法
  4. 考虑使用克隆接口:提供统一的克隆方法,隐藏具体实现细节
  5. 性能考量:对于创建成本高的对象,原型模式可以显著提高性能

原型模式是现代C++开发中非常有用的模式,特别是在需要创建复杂对象或对象创建成本较高的场景中。通过合理使用原型模式,可以提高代码的灵活性和性能。

相关推荐
C++_girl2 小时前
缓存未命中
c++·缓存
bikong72 小时前
桥接模式,打造灵活可扩展的日志系统C++
c++·桥接模式
艾莉丝努力练剑2 小时前
【C++】类和对象(下):初始化列表、类型转换、Static、友元、内部类、匿名对象/有名对象、优化
linux·运维·c++·经验分享
疋瓞3 小时前
C++_STL和数据结构《1》_STL、STL_迭代器、c++中的模版、STL_vecto、列表初始化、三个算法、链表
数据结构·c++·算法
三体世界3 小时前
测试用例全解析:从入门到精通(1)
linux·c语言·c++·python·功能测试·测试用例·测试覆盖率
Bear on Toilet3 小时前
继承类模板:函数未在模板定义上下文中声明,只能通过实例化上下文中参数相关的查找找到
开发语言·javascript·c++·算法·继承
new_daimond3 小时前
设计模式-装饰器模式详解
设计模式·装饰器模式
努力努力再努力wz4 小时前
【c++进阶系列】:map和set的模拟实现(附模拟实现的源码)
java·linux·运维·开发语言·c++