题目描述:
Prototype
动机(motivation)
- 在软件系统中,经常面临这“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。
- 如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得依赖这些”易变对象“的客户程序不随着需求改变而改变。
模式定义
使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
——《设计模式》GoF
要点总结
- Prototype模式同样用于隔离对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有稳定的接口。
- Prototype模式对于“如何创建易变类的实体对象“采用”原型克隆“的方法来做,
它使得我们可以非常灵活地动态创建”拥有某些稳定接口“的新对象——所需工作仅仅是注册一个新类的对象(即原型),
然后在任何需要的地方Clone。 - Prototype模式中的Clone方法可以利用某些框架中的序列化来实现深拷贝。
代码结构
.
├── build.sh
├── clearBuild.sh
├── CMakeLists.txt
├── src
│ ├── examStu.cpp
│ ├── include
│ │ └── examStu.h
│ └── main.cpp
源码例子
examStu.h
#ifndef _EXANSTU__
#define _EXANSTU__
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class CPrototype
{
public:
CPrototype()=default;
virtual ~CPrototype(){
cout << "~CPrototype() "<<endl;}
virtual std::shared_ptr<CPrototype> Clone()= 0; //通过克隆自己来创建对象
};
class ConcretePrototype : public CPrototype
{
public:
ConcretePrototype():m_counter(0){
cout << "ConcretePrototype(),m_counter= " << m_counter <<endl;}
//拷贝构造函数
ConcretePrototype(const ConcretePrototype& rhs)
{
m_counter = rhs.m_counter;
}
virtual ~ConcretePrototype()
{
m_counter = 4;
cout << "~ConcretePrototype(),m_counter= " << m_counter <<endl;
}
std::shared_ptr<CPrototype> Clone() override
{
cout << "ConcretePrototype::Clone() called"<<endl;
return std::make_shared<ConcretePrototype>(*this);
}
private:
int m_counter;
};
#endif
main.cpp
#include <iostream>
#include <string.h>
#include <memory>
#include "examStu.h"
using namespace std;
int main(int argc, char *argv[])
{
CPrototype* p = new ConcretePrototype();
auto a = p->Clone();
delete p;
return 0;
}