设计模式【5】——原型模式( Prototype 模式)


前言

Prototype 模式提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在 C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时候的根源之一。


一、原型模式( Prototype 模式)

Prototype 模式提供了一个通过已存在对象进行新对象创建的接口(Clone) ,Clone()实现和具体的实现语言相关,在 C++中我们将通过拷贝构造函数实现之。UML图如下:
Prototype 模式示意图

二、具体源码

1.Prototype.h

代码如下(示例):

#pragma once

#ifndef _PROTOTYPE_H_ 
#define _PROTOTYPE_H_ 

#include <iostream>

class Prototype
{
public:

  virtual ~Prototype();
  virtual Prototype* Clone() const = 0;

protected:

  Prototype();
private:
};
class ConcretePrototype :public Prototype
{
public:

  ConcretePrototype();
  ConcretePrototype(const ConcretePrototype& cp);
  ~ConcretePrototype();
  Prototype* Clone() const;

protected:
private:
};
#endif //~_PROTOTYPE_H_

2.Prototype.cpp

代码如下(示例):

#include "Prototype.h"

using namespace std;

Prototype::Prototype()
{
}

Prototype::~Prototype()
{
}

Prototype* Prototype::Clone() const
{
  return 0;
}

ConcretePrototype::ConcretePrototype()
{
}

ConcretePrototype::~ConcretePrototype()
{
}

ConcretePrototype::ConcretePrototype(const ConcretePrototype& cp)
{
  cout << "ConcretePrototype copy ..." << endl;
}

Prototype* ConcretePrototype::Clone() const
{
  return new ConcretePrototype(*this);
}

3.main.cpp

代码如下(示例):

#include "Prototype.h"

using namespace std;

int main(int argc, char* argv[])
{
  Prototype* p = new ConcretePrototype();
  Prototype* p1 = p->Clone();
  return 0;
}

三、运行结果

Prototype 模式运行结果如下:
Prototype 模式运行结果

总结

Prototype 模式的结构和实现都很简单,其关键就是(C++中)拷贝构造函数的实现方式,这也是 C++实现技术层面上的事情。由于在示例代码中不涉及到深层拷贝(主要指有指针、复合对象的情况),因此我们通过编译器提供的默认的拷贝构造函数(按位拷贝)的方式进行实现,着重展示了Prototype 模式本身的思想。
Prototype 模式通过复制原型(Prototype)而获得新对象创建的功能,这里 Prototype 本身就是“对象工厂”(因为能够生产对象),实际上 Prototype 模式和 Builder 模式、AbstractFactory 模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder 模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory 模式重在产生多个相互依赖类的对象,而 Prototype 模式重在从自身复制自己创建新类。


本文参考《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》,对内容进行整理,方便大家学习。如想学习详细内容,请参考此书。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希望早日退休的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值