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. 需要克服克隆产生的问题:在使用原型设计模式时,应该注意对象复制过程中可能产生的问题,比如对于复杂对象的复制可能会导致副作用等。

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

相关推荐
熬夜学编程的小王19 分钟前
C++类与对象深度解析(一):从抽象到实践的全面入门指南
c++·git·算法
CV工程师小林21 分钟前
【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(下篇)
数据结构·c++·算法·leetcode·深度优先·剪枝
蜜桃小阿雯40 分钟前
JAVA开源项目 旅游管理系统 计算机毕业设计
java·开发语言·jvm·spring cloud·开源·intellij-idea·旅游
Benaso41 分钟前
Rust 快速入门(一)
开发语言·后端·rust
zh路西法1 小时前
基于opencv-C++dnn模块推理的yolov5 onnx模型
c++·图像处理·pytorch·opencv·yolo·dnn·yolov5
wjs20241 小时前
HTML5 新元素
开发语言
慕明翰1 小时前
Springboot集成JSP报 404
java·开发语言·spring boot
satan–01 小时前
R语言的基本语句及基本规则
开发语言·windows·r语言
-指短琴长-1 小时前
BFS解决多源最短路问题_01矩阵_C++【含多源最短路问题介绍+dist数组介绍】
c++·矩阵·宽度优先
小码农<^_^>1 小时前
c++继承(下)
开发语言·c++