随笔 - 68  文章 - 0 评论 - 41 阅读 - 56万
< 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

以下是我自己学习设计模式的感想。

原型模式

学过C++的都知道拷贝构造函数,复制一个对象分为浅拷贝和深拷贝。

浅拷贝:就是给对象中的每个成员变量进行复制,就是把A1类中的变量直接赋给A2类中变量,属于值传递,但是涉及到有new之类内存分配的地方,他们却是共享内存的。

深拷贝:就是不仅使用值传递,而是要每个变量都有自己一份独立的内存空间,互不干扰。

默认的拷贝构造函数是浅拷贝的,如果要实现深拷贝,就需要重写拷贝构造函数T(const T&)。

既然有了拷贝构造函数,还要引入原型模式呢?根据我自己查阅资料之后,我觉得好像是面向对象语言中都是引用传递,而且只提供简单的浅拷贝,所以没有拷贝构造函数这么一说,于是要实现深拷贝的功能,就需要原型模式。不知道这个想法对不对,欢迎指正。

image

 

常用场景

基本就是你需要从A的实例得到一份与A内容相同,但是又互不干扰的实例的话,就需要使用原型模式。

 

优点

1.使用拷贝模式比直接new一个对象的开销要小的多。

2.可以在程序运行时(对象属性发生了变化),得到一份内容相同的实例,但之间还不会相互干扰。

 

缺点

 

 

C++实现

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
#ifndef _PROTOTYPE_H_
#define _PROTOTYPE_H_
 
 
class Prototype{
 
public:
    Prototype();
    virtual ~Prototype();
 
    virtual Prototype* clone() = 0;
};
 
 
class ConcretePrototype:public Prototype{
 
public:
    ConcretePrototype();
    ~ConcretePrototype();
 
    Prototype* clone();
 
private:
    ConcretePrototype(const ConcretePrototype&);
};
 
#endif

 

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
32
33
34
35
36
37
38
#include "Prototype.h"
#include <stdio.h>
 
 
Prototype::Prototype()
{
 
}
 
 
Prototype::~Prototype()
{
 
}
 
 
ConcretePrototype::ConcretePrototype()
{
 
}
 
 
ConcretePrototype::~ConcretePrototype()
{
 
}
 
 
ConcretePrototype::ConcretePrototype(const ConcretePrototype& c)
{
    fprintf(stderr,"ConcretePrototype copy construct!\n");
}
 
 
Prototype* ConcretePrototype::clone()
{
    return new ConcretePrototype(*this);
}

 

1
2
3
4
5
6
7
8
9
10
#include "Prototype.h"
 
 
int main()
{
    Prototype* p = new ConcretePrototype();
 
    Prototype* a = p->clone();
    return 0;
}

 

1
g++ -o client client.cpp Prototype.cpp

 

运行的结果

image

posted on   曾经的你|  阅读(10921)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示