长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 创建型模式

    • 工厂方法模式(Factory Method Pattern)
    • 抽象工厂模式(Abstract Factory Pattern)
    • 单例模式(Singleton Pattern)
    • 建造者模式(Builder Pattern)
    • 原型模式(Prototype Pattern)
      • 概念
      • 思想
      • 角色
      • 优点
      • 缺点
      • 类图
      • 示例代码(C++)
  • 结构型模式

  • 行为型模式

  • 设计模式
  • 创建型模式
DC Wang
2023-05-28
目录

原型模式(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

# 示例代码(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

示例代码描述: 示例代码中定义了抽象原型(AbstractPrototype)作为克隆方法的接口,具体原型A(ConcretePrototypeA)和具体原型B(ConcretePrototypeB)实现了克隆方法,并添加了自己的数据成员和打印方法。客户端(Client)通过设置原型并调用克隆方法来创建新的对象。

在示例代码中,创建了原型A和原型B的对象,并设置它们的数据。然后,通过客户端使用原型A和原型B分别创建了两个克隆对象,并打印了它们的数据。运行结果如下:

codeConcretePrototypeA: Data A
ConcretePrototypeB: Data B
1
2
编辑 (opens new window)
#设计模式#创建型模式
上次更新: 2023/06/09, 13:17:31
建造者模式(Builder Pattern)
适配器模式(Adapter Pattern)

← 建造者模式(Builder Pattern) 适配器模式(Adapter Pattern)→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式