Prototype(原型模式)

1. 意图

原型设计模式是一种创建型设计模式,它通过复制现有对象来创建新对象,而无需进行显式的实例化过程。也就是用原型实例指定创建对象类型,并且通过拷贝这些原型创建新的对象。

2. 适用性

《Gof设计模式:可复用面向对象软件的基础》中对适用性描述如下:

  • 当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式。
  • 当要实例化的类是在运动时刻指定。
  • 为了避免创建一个与产品类层次平行的工厂类层次。
  • 当一个类的实例只能有几个不同状态组合中的一种时,建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

3. 实现

cpp 复制代码
#include <iostream>

class Prototype {
public:
  virtual ~Prototype() {}
  virtual Prototype *Clone() = 0;

  inline void SetData(int data) { m_data = data; }
  inline int GetData() const { return m_data; }
  virtual void Print() {
    std::cout << "Prototype m_data = " << m_data << std::endl;
  }

private:
  int m_data = -1;
};

class ConcretePrototype : public Prototype {
public:
  ConcretePrototype(int data) { this->SetData(data); }

  virtual Prototype *Clone() override {
    return new ConcretePrototype(this->GetData());
  }

  virtual void Print() override {
    std::cout << "ConcretePrototype m_data = " << this->GetData() << std::endl;
  }

private:
};

void Test() {
  Prototype *prototype = new ConcretePrototype(10);
  Prototype *ptr = prototype->Clone();
  ptr->Print();
  ptr->SetData(20);
  ptr->Print();

  delete prototype;
  delete ptr;
}

int main() {
  Test();
  return 0;
}

执行结果

|-------------------------------------------------------------|
| ConcretePrototype m_data = 10 ConcretePrototype m_data = 20 |

4. 优缺点

  • 优点:
  1. 简化对象的创建过程:原型设计模式使得对象的创建非常简单,只需要复制一个现有对象即可,省去了繁琐的实例化过程。
  2. 提高性能:相比于通过实例化对象的方式来创建新对象,原型设计模式更加高效。因为原型对象已经经过了一次实例化过程,所有的初始化工作都已经完成,创建新对象只需复制原型对象的属性值即可。
  3. 动态添加和删除对象:原型设计模式允许在运行时动态添加和删除对象,通过复制一个已有对象来创建新对象的方式更加灵活。
  • 缺点:
  1. 对象必须提供复制方法:为了能够将对象复制出来,对象必须提供一个能够复制自身的方法。这就要求对象具有较高的自我复制能力,不是所有的对象都具备这个能力。
  2. 深拷贝问题:原型设计模式中,一般有浅拷贝和深拷贝两种方式。浅拷贝只复制对象的引用,而深拷贝会同时复制对象的所有属性。深拷贝可能会导致性能下降和复制过程变得复杂。
  3. 需要克服克隆产生的问题:在使用原型设计模式时,应该注意对象复制过程中可能产生的问题,比如对于复杂对象的复制可能会导致副作用等。

综上所述,原型设计模式具有简化对象创建过程和提高性能的优点,但需要对象具备复制方法,并且要注意深拷贝和克隆产生的问题。

相关推荐
小小龙学IT11 小时前
Qt 6 跨平台开发完全指南:从信号槽机制到实际项目落地
开发语言·qt
leisoo809711 小时前
ig50数据落盘ClickHousevsTimescaleDBvsDuckDB实测对比 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
wWYy.11 小时前
C++与C的区别
c语言·c++
敢敢のwings12 小时前
智元 GO-2 与 AgiBot-World 深度解读
开发语言·后端·golang
yaoxin52112312 小时前
503. Java 反射 - 编写 ServiceFactory 类
java·开发语言·python
一个帅气昵称啊12 小时前
.Net C# AI智能体开发-快速开始
开发语言·c#·.net
冬夜戏雪13 小时前
agent的trace 和eval
开发语言·前端·javascript
Sagittarius_A*13 小时前
Burst Lab | PHP 审计 13|反序列化(三):POP 链构造与 Gadget Chain 分析
开发语言·web安全·php·代码审计·反序列化
职场的momo13 小时前
11个后端与AI岗位同时开放:Java、网关、推理优化怎么匹配
java·开发语言·人工智能
蓝速科技13 小时前
蓝速科技丨新旧楼宇混杂场景下会议室预约门牌屏一体化改造方案
开发语言·科技·php