查看原文
其他

设计模式之原型模式

程序喵大人 程序喵大人 2022-08-22

【成功的花儿,人们只惊羡她现时的明艳!当初她的芽儿浸透了奋斗的泪泉,撒遍了牺牲的血雨。】
——冰心

原型模式也属于创建型模式,用于创建重复的对象,它提供了一种创建相同对象的最佳方式。当直接创建对象需要较大的代价时,可以使用原型模式。例如对象需要读取文件或者向服务器发起请求获取某些必要数据才可以被创建,每次都直接创建显然有很大代价,所以可以考虑缓存数据,提供一个克隆接口,直接用缓存的数据创建对象。
原型模式的实现较为简单,基类提供Clone虚函数,子类只需实现这个Clone函数即可。
#include <iostream>
struct Animal { virtual ~Animal() {}
virtual Animal* Clone() = 0; virtual void ShowName() = 0;};
struct Tiger : public Animal { Animal* Clone() override { return new Tiger(); }
void ShowName() override { std::cout << "Tiger" << std::endl; }};
int main() { Animal* animal = new Tiger(); animal->ShowName(); Animal* animal_copy = animal->Clone(); // 想要一个和animal完全相同的实例 animal_copy->ShowName(); return 0;}
原型模式还有个重要意义:当一个基类指针指向某个子类对象时,这时如果想要拷贝这个子类对象是比较困难的,因为只通过一个基类指针我们不知道该指针究竟指向了什么类型的对象,即无法调用相应的构造函数,通过typeid加switch貌似代价太大,所以可以使用此原型模式。

参考资料

https://www.runoob.com/design-pattern/prototype-pattern.htmlhttp
https://www.zhihu.com/question/52610176


往期推荐





您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存