一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

设计模式之原型模式

  原型模式是用原型实例指定创建兑现的种类,并且通过拷贝这些原型创建新的对象。原型模式说白了其实就是有一个把自己拷贝一下的方法。该模式很好理解,该模式独特地方不是类与类之间的关系,更多的是从语义上理解,只是实现了一个接口而已。

其UML图如下:

 

 示例代码如下:

复制代码
 1 // PrototypeModel.h文件
 2 #pragma once
 3 #include <iostream>
 4 #include <string>
 5 // 原型类
 6 class Prototype
 7 {
 8 public:
 9     virtual Prototype * Clone() = 0;
10 };
11 // 
12 class ConcretePrototype_0 : public Prototype
13 {
14 public:
15     ConcretePrototype_0(std::string name)
16     {
17         m_strTypeName = name;
18     }
19     virtual Prototype * Clone()
20     {
21         ConcretePrototype_0 *p = new ConcretePrototype_0(m_strTypeName);
22         *p = *this;
23         return p;
24     }
25     void Show()
26     {
27         std::cout << m_strTypeName << std::endl;
28     }
29 private:
30     std::string m_strTypeName;
31 };
32 
33 class ConcretePrototype_1 : public Prototype
34 {
35 public:
36     ConcretePrototype_1(std::string name)
37     {
38         m_strTypeName = name;
39     }
40     virtual Prototype * Clone()
41     {
42         ConcretePrototype_1 *p = new ConcretePrototype_1(m_strTypeName);
43         *p = *this;
44         return p;
45     }
46     void Show()
47     {
48         std::cout << m_strTypeName << std::endl;
49     }
50 private:
51     std::string m_strTypeName;
52 };
复制代码

测试代码如下:

复制代码
 1 #include <iostream>
 2 #include "PrototypeModel.h"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7     ConcretePrototype_0 * p1 = new ConcretePrototype_0("A");
 8     ConcretePrototype_1 * p2 = (ConcretePrototype_1 *)(p1->Clone());
 9     p1->Show();
10     p2->Show();
11     delete p1;
12     delete p2;
13 
14     getchar();
15     return 0;
16 }
复制代码

测试结果如下图:

posted on   一杯清酒邀明月  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2020-07-07 Qt 编译时报错“退出,退出代码2”的原因
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示