Prototype(原型模式)

1. 意图

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

2. 适用性

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

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

3. 实现

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值