原型模式(Prototype Pattern)
# 原型模式(Prototype Pattern)
原型模式(Prototype Pattern)是一种创建型设计模式,它通过克隆现有对象来创建新对象,而无需通过实例化类并设置其属性。
# 概念
原型模式通过克隆已有对象来创建新的对象,避免了类创建者与类使用者之间的依赖关系,提供了一种更加灵活的对象创建方式。
# 思想
原型模式的核心思想是在原型对象的基础上进行克隆,而不是重新创建一个对象。通过克隆,原型模式可以避免子类化,使得对象的创建更加灵活。
# 角色
- 抽象原型(Abstract Prototype):声明克隆方法,是所有具体原型类的共同接口。
- 具体原型(Concrete Prototype):实现抽象原型的克隆方法,克隆自身以创建新的对象。
- 客户端(Client):使用原型模式的客户端代码,通过克隆创建新对象。
# 优点
- 简化对象的创建过程,避免了类创建者与类使用者之间的依赖关系。
- 可以动态添加或删除原型,灵活性高。
- 可以避免子类化,提高性能。
# 缺点
- 需要为每个类都实现克隆方法,增加了类的复杂度。
- 克隆方法需要深复制或浅复制的考虑,可能会导致对象状态的不一致。
# 类图
@startuml
class AbstractPrototype {
+Clone(): AbstractPrototype
}
class ConcretePrototypeA {
+Clone(): AbstractPrototype
}
class ConcretePrototypeB {
+Clone(): AbstractPrototype
}
class Client {
-prototype: AbstractPrototype
+SetPrototype(prototype: AbstractPrototype)
+MakeClone(): AbstractPrototype
}
Client -- AbstractPrototype
Client ..> ConcretePrototypeA
Client ..> ConcretePrototypeB
@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 示例代码(C++)
#include <iostream>
#include <string>
// 抽象原型
class AbstractPrototype {
public:
virtual AbstractPrototype* Clone() = 0;
virtual void SetData(const std::string& data) = 0;
virtual void PrintData() = 0;
};
// 具体原型A
class ConcretePrototypeA : public AbstractPrototype {
private:
std::string data;
public:
AbstractPrototype* Clone() {
ConcretePrototypeA* clone = new ConcretePrototypeA();
clone->SetData(this->data);
return clone;
}
void SetData(const std::string& data) {
this->data = data;
}
void PrintData() {
std::cout << "ConcretePrototypeA: " << data << std::endl;
}
};
// 具体原型B
class ConcretePrototypeB : public AbstractPrototype {
private:
std::string data;
public:
AbstractPrototype* Clone() {
ConcretePrototypeB* clone = new ConcretePrototypeB();
clone->SetData(this->data);
return clone;
}
void SetData(const std::string& data) {
this->data = data;
}
void PrintData() {
std::cout << "ConcretePrototypeB: " << data << std::endl;
}
};
// 客户端
class Client {
private:
AbstractPrototype* prototype;
public:
void SetPrototype(AbstractPrototype* prototype) {
this->prototype = prototype;
}
AbstractPrototype* MakeClone() {
return prototype->Clone();
}
};
int main() {
ConcretePrototypeA* originalA = new ConcretePrototypeA();
originalA->SetData("Data A");
ConcretePrototypeB* originalB = new ConcretePrototypeB();
originalB->SetData("Data B");
Client client;
// 使用原型A创建新对象
client.SetPrototype(originalA);
AbstractPrototype* cloneA = client.MakeClone();
cloneA->PrintData();
// 使用原型B创建新对象
client.SetPrototype(originalB);
AbstractPrototype* cloneB = client.MakeClone();
cloneB->PrintData();
delete originalA;
delete originalB;
delete cloneA;
delete cloneB;
return 0;
}
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
示例代码描述: 示例代码中定义了抽象原型(AbstractPrototype
)作为克隆方法的接口,具体原型A(ConcretePrototypeA
)和具体原型B(ConcretePrototypeB
)实现了克隆方法,并添加了自己的数据成员和打印方法。客户端(Client
)通过设置原型并调用克隆方法来创建新的对象。
在示例代码中,创建了原型A和原型B的对象,并设置它们的数据。然后,通过客户端使用原型A和原型B分别创建了两个克隆对象,并打印了它们的数据。运行结果如下:
codeConcretePrototypeA: Data A
ConcretePrototypeB: Data B
1
2
2
编辑 (opens new window)
上次更新: 2023/06/09, 13:17:31
- 01
- Linux系统移植(五)--- 制作、烧录镜像并启动Linux02-05
- 03
- Linux系统移植(三)--- Linux kernel移植02-05