创建型模式 | 原型模式

一、原型模式

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方法,获取到的依然是原型对象的最新副本),并在当前基础上进行拷贝。

相关推荐
网小鱼的学习笔记19 分钟前
创建型设计模式(工厂、builder、原型、单例)
java·后端·设计模式
逆境不可逃30 分钟前
【从零入门23种设计模式21】行为型之空对象模式
java·开发语言·数据库·算法·设计模式·职场和发展
蜜獾云15 小时前
设计模式之命令模式:给其他模块下达命令
设计模式·命令模式
小湘西21 小时前
拓扑排序(Topological Sort)
python·设计模式
蜜獾云1 天前
设计模式之观察者模式:监听目标对象的状态改变
观察者模式·设计模式·rxjava
知无不研1 天前
中介者模式
c++·设计模式·中介者模式
bmseven1 天前
大白话讲解23种设计模式简介
设计模式
蜜獾云1 天前
设计模式之代理模式:本地接口代理远程接口的调用
设计模式·系统安全·代理模式
蜜獾云1 天前
设计模式之访问者模式:动态的给目标对象增加新功能
设计模式·访问者模式
蜜獾云1 天前
设计模式之策略模式:替换掉糟糕的if else语句实现面向对象编程而非面向过程
设计模式·策略模式