创造型设计模式之原型模式

同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式,来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型模式

主要通过以下方式实现
抽象原型类:定义克隆方法的接口,通常是一个纯虚函数。
具体原型类:实现克隆方法,返回自身的副本。
原型管理器(可选):管理可用的原型对象,提供克隆操作的统一接口。

#include <iostream>
#include <mutex>
#include <string>
#include <memory>
#include <unordered_map>
using namespace std;

/*-----------------------------------------------------------原型模式------------------------------------------------------------------*/
/*
主要通过以下方式实现
抽象原型类:定义克隆方法的接口,通常是一个纯虚函数。
具体原型类:实现克隆方法,返回自身的副本。
原型管理器(可选):管理可用的原型对象,提供克隆操作的统一接口。
*/
// 抽象原型类
class shape
{
public:
    virtual ~shape() = default;
    virtual std::unique_ptr<shape> clone() const = 0;
};

class circleshape : public shape
{
public:
    circleshape()
    {
        std::cout << "画了个圆形" << '\n';
    }
    std::unique_ptr<shape> clone() const override
    {
        std::cout << "克隆了个圆形" << '\n';
        return std::unique_ptr<shape>(new circleshape(*this));
    }

};

class rectangleshape : public shape
{
public:
    rectangleshape()
    {
        std::cout << "画了个矩形" << '\n';
    }

    std::unique_ptr<shape> clone() const override
    {
        std::cout << "克隆了个矩形" << '\n';
        return std::unique_ptr<rectangleshape>(new rectangleshape(*this));
    }
};

class shapemanager
{
public:
    shapemanager()
    {
        registershape();
    }

    void registershape()
    {
        shape_mange["circle"] = std::unique_ptr<circleshape>(new circleshape);
        shape_mange["rectangle"] = std::unique_ptr<rectangleshape>(new rectangleshape);
    }

    std::unique_ptr<shape> getshape(const string &str_type)
    {
        if (shape_mange.end() != shape_mange.find(str_type))
        {
            return shape_mange[str_type]->clone();
        }
    }

private:
    unordered_map<std::string, std::unique_ptr<shape>> shape_mange;
};

int main(int argc, char *argv[])
{
    shapemanager manager;
    std::unique_ptr<shape> ct = manager.getshape("circle");
    std::unique_ptr<shape> rt = manager.getshape("rectangle");

    return 0;
}
View Code

 

posted @ 2025-05-22 20:16  璀丶璨星灬空  阅读(4)  评论(0)    收藏  举报