当前位置:首页 > 公众号精选 > 程序喵大人
[导读]【成功的花儿,人们只惊羡她现时的明艳!当初她的芽儿浸透了奋斗的泪泉,撒遍了牺牲的血雨。】 ——冰心 原型模式也属于创建型模式,用于创建重复的对象,它提供了一种创建相同对象的最佳方式。当直接创建对象需要较大的代价时,可以使用原型模式。例如对象需


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

——冰心

原型模式也属于创建型模式,用于创建重复的对象,它提供了一种创建相同对象的最佳方式。当直接创建对象需要较大的代价时,可以使用原型模式。例如对象需要读取文件或者向服务器发起请求获取某些必要数据才可以被创建,每次都直接创建显然有很大代价,所以可以考虑缓存数据,提供一个克隆接口,直接用缓存的数据创建对象。
原型模式的实现较为简单,基类提供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.html http
https://www.zhihu.com/question/52610176


往期推荐





免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭