【嵌入式c++】设计模式之原型模式(Prototype)

题目描述:

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;
}

猜你喜欢

转载自blog.csdn.net/qq_15555275/article/details/109452485