创造型设计模式之原型模式
同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式,来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型模式
主要通过以下方式实现
抽象原型类:定义克隆方法的接口,通常是一个纯虚函数。
具体原型类:实现克隆方法,返回自身的副本。
原型管理器(可选):管理可用的原型对象,提供克隆操作的统一接口。

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