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 分钟前
Netty 简易指南
java·开发语言·netty
洵有兮6 分钟前
python第四次作业
开发语言·python
wjs20249 分钟前
C++ 多线程编程入门指南
开发语言
小严家22 分钟前
Java基础教程大全完整学习路径
java·开发语言·学习
毕设源码-朱学姐23 分钟前
【开题答辩全过程】以 基于Java的电影推荐系统为例,包含答辩的问题和答案
java·开发语言
天赐学c语言26 分钟前
12.19 - 买卖股票的最佳时机 && const的作用
c++·算法·leecode
sheji341628 分钟前
【开题答辩全过程】以 基于SSM的校园新冠疫苗接种信息管理系统为例,包含答辩的问题和答案
java·开发语言
dddaidai12339 分钟前
深入JVM(四):垃圾收集器
java·开发语言·jvm
AI科技星1 小时前
圆柱螺旋运动方程的一步步求导与实验数据验证
开发语言·数据结构·经验分享·线性代数·算法·数学建模
laocooon5238578861 小时前
python 收发信的功能。
开发语言·python