创建型模式 | 原型模式

一、原型模式

1、原理

原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。原型像是一个模板,可以基于它复制好多对象,而复制出来的副本产生任何变化都不会影响到原型(注意:前提是clone的实现要满足深拷贝)。

2、UML类图

要实现原型模式,关键就是要实现原型接口里面的Clone方法,通过Clone方法来产生原型对象的副本,如下:

3、示例

声明一个IShape接口,该接口核心的是Clone方法。分别两个实现类CircleSquare,都实现了接口里面的方法,然后分别创建两个实现类对应的实例,并通过Clone方法产生实例的副本,如下:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

// IShape 接口类
class IShape
{
public:
    virtual string GetShapeName() = 0;
    virtual void SetShapeName(string &) = 0;
    virtual IShape* Clone() = 0;
};

// Square 类
class Square : public IShape
{
private:
    string m_shapeName;

public:
    Square(string &shapeName) : m_shapeName(shapeName){}
    string GetShapeName()
    {
        return m_shapeName;
    }
    void SetShapeName(string &str)
    {
        m_shapeName = str;
    }
    IShape* Clone()
    {
        return new Square(this->m_shapeName);
    }
};

// Circle 类
class Circle : public IShape
{
private:
    string m_shapeName;

public:
    Circle(string &shapeName) : m_shapeName(shapeName){}
    string GetShapeName()
    {
        return m_shapeName;
    }
    void SetShapeName(string &str)
    {
        m_shapeName = str;
    }
    IShape* Clone()
    {
        return new Circle(this->m_shapeName);
    }
};

int main()
{
    string str1 = "Square";
    string str2 = "Circle";

    IShape *pShape1 = new Square(str1);
    IShape *pShape2 = new Circle(str2);

    IShape *pClone1 = pShape1->Clone();
    IShape *pClone2 = pShape2->Clone();

    cout << "pClone1 name : " << pClone1->GetShapeName() << endl;
    cout << "pClone2 name : " << pClone2->GetShapeName() << endl;

    return 0;
}

4、总结

使用原型模式隐藏了对象创建的细节,不论对象多么的复杂,使用者调用Clone接口就可以创建一个原型对象的副本。同时无需初始化,可动态地获取当前原型的状态(即:如果修改了原型对象,在修改后调用Clone方法,获取到的依然是原型对象的最新副本),并在当前基础上进行拷贝。

相关推荐
MessiGo2 小时前
Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象
开发语言·javascript·原型模式
蔡蓝3 小时前
设计模式-建造者模式
服务器·设计模式·建造者模式
勤奋的知更鸟4 小时前
Java编程之原型模式
java·开发语言·原型模式
不伤欣8 小时前
游戏设计模式 - 子类沙箱
游戏·unity·设计模式
漫谈网络8 小时前
MVC与MVP设计模式对比详解
设计模式·mvc
蔡蓝8 小时前
设计模式-观察着模式
java·开发语言·设计模式
哆啦A梦的口袋呀10 小时前
基于Python学习《Head First设计模式》第六章 命令模式
python·学习·设计模式
半路下车11 小时前
【Harmony OS 5】HarmonyOS应用测试指南
设计模式·harmonyos
周某某~11 小时前
一.设计模式的基本概念
设计模式
on the way 12311 小时前
行为型设计模式之Interpreter(解释器)
设计模式