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

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

相关推荐
大草原的小灰灰1 分钟前
Python面向对象编程
开发语言·python
知识分享小能手2 分钟前
C学习教程,从入门到精通,C语言概述 —— 知识点详解(1)
c语言·开发语言·学习
垆边人似月.15 分钟前
日志时间窗口内的最大并发请求数(100分 / 滑动窗口 + 排序)
数据结构·c++·算法
Chen_harmony38 分钟前
一、C++入门基础
开发语言·c++
学逆向的41 分钟前
远程线程注入
开发语言·jvm·网络安全·win32
水饺编程1 小时前
第1章,[Win32 章节]:Windows 的方方面面
c语言·c++·windows·visual studio
阡陌数智1 小时前
RAG 系统的召回退化:向量库、分块、重排全链路问题排查与优化实践
开发语言·人工智能·语言模型·自然语言处理·推荐算法
geovindu1 小时前
rust: Flyweight Pattern
开发语言·后端·设计模式·rust·享元模式·结构型模式
Escalating_xu1 小时前
【C 语言】字符函数和字符串函数:从 ctype 到 strtok、strerror 全面解析
java·c语言·开发语言
悠仁さん2 小时前
【C++】auto
java·前端·c++