前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GoF 23种经典的设计模式——原型模式

GoF 23种经典的设计模式——原型模式

作者头像
Andromeda
发布2024-01-16 09:41:27
1100
发布2024-01-16 09:41:27
举报
文章被收录于专栏:Andromeda的专栏Andromeda的专栏

原型模式(Prototype Pattern)是一种创建型设计模式,其主要思想是通过复制(克隆)现有对象来创建新的对象,而不是通过构造函数创建。这样可以避免重复创建相似对象时的性能损耗,同时也更灵活,可以动态地添加或删除对象。原型模式的性能优势主要来自于避免了重复的初始化和构造过程。在原型模式中,对象的克隆是通过复制已有对象的数据而不是重新构造对象,因此避免了重复的初始化和资源获取操作,提高了性能。

在原型模式中,有一个原型对象,它是被复制的对象。通过克隆原型对象,可以创建新的对象,并且可以通过改变克隆的属性来实现个性化定制。在使用原型模式时,通常会提供一个克隆方法,用于复制对象。

原型模式
原型模式

原型模式在以下情况下特别有用,可以提高性能并提供更灵活的设计:

  1. 对象的创建成本较高: 如果创建一个对象的成本很高昂,例如需要进行复杂的计算、数据库操作或网络调用,那么使用原型模式就可以避免多次创建相似对象的开销。通过克隆现有对象,可以在不重新计算或请求数据的情况下获得新对象。
  2. 对象的创建频率很高: 当需要频繁创建对象时,原型模式可以减少对象创建的时间和资源开销。相比于通过构造函数创建新对象,直接克隆已有对象通常更加高效。
  3. 类的实例化需要大量的数据获取: 如果对象的初始化涉及到从数据库、文件或远程服务器获取大量数据,通过原型模式可以避免多次获取数据,而是通过克隆现有对象来创建新对象。
  4. 需要动态配置对象: 当对象的配置信息可能经常变化时,使用原型模式可以在运行时动态地配置对象。通过克隆现有对象并根据需要修改其中的属性,可以快速地创建新的对象配置。
  5. 对象的结构比较复杂: 在某些情况下,对象的创建涉及到多个步骤,可能需要复杂的初始化逻辑。通过克隆已有对象,可以避免重新执行这些复杂的初始化步骤,提高性能。

需要注意的是,虽然原型模式可以提高性能,但在一些情况下可能引入对象状态的共享,因此在设计时需要确保克隆的对象是独立的,不会相互影响。此外,如果原型对象包含引用类型的成员变量,需要特别注意深克隆,以防止共享引用类型对象的问题。

简单实现如下。有一个抽象基类 Prototype,它定义了 clone()print() 这两个虚函数。PrototypeClass 是具体的原型类,它继承了 Prototype 并实现了这两个虚函数。在 PrototypeClass 中,它实现了深拷贝构造函数和克隆接口。深拷贝构造函数用于创建一个新的对象并拷贝原始对象的数据,而克隆接口 clone() 则是通过调用深拷贝构造函数创建一个新的对象并返回。

代码语言:javascript
复制
#include <iostream>
#include <cstring>
class PrototypeClass;
class Prototype;

class Prototype
{
public:
    virtual Prototype *clone() = 0;
    virtual void print() = 0;
};

class PrototypeClass : public Prototype
{
private:
    char *str;

public:
    PrototypeClass(const char *str)
    {
        this->str = new char[strlen(str) + 1];
        strcpy(this->str, str);
    };
    PrototypeClass(PrototypeClass &pc)
    {
        // 深拷贝
        delete[] str;
        this->str = new char[strlen(pc.str) + 1];
        strcpy(this->str, pc.str);
    }
    Prototype *clone() override
    {
        // 克隆接口
        return new PrototypeClass(*this);
    }
    void print()
    {
        std::cout << str << std::endl;
    }
    ~PrototypeClass()
    {
        delete[] str;
    };
};

int main(int argc, char const *argv[])
{
    PrototypeClass *p1 = new PrototypeClass("Hello world!");
    p1->print();
    // 拷贝构造函数
    PrototypeClass *p2 = p1;
    p2->print();
    // 克隆接口
    Prototype *p3 = p1->clone();
    p3->print();
    return 0;
}

.post-copyright { box-shadow: 2px 2px 5px; line-height: 2; position: relative; margin: 40px 0 10px; padding: 10px 16px; border: 1px solid var(--light-grey); transition: box-shadow .3s ease-in-out; overflow: hidden; border-radius: 12px!important; background-color: var(--main-bg-color); } .post-copyright:before { position: absolute; right: -26px; top: -120px; content: '\f25e'; font-size: 200px; font-family: 'FontAwesome'; opacity: .2; } .post-copyright__title { font-size: 22px; } .post-copyright_type { font-size: 18px; color:var(--theme-color) } .post-copyright .post-copyright-info { padding-left: 6px; font-size: 15px; } .post-copyright-m-info .post-copyright-a, .post-copyright-m-info .post-copyright-c, .post-copyright-m-info .post-copyright-u { display: inline-block; width: fit-content; padding: 2px 5px; font-size: 15px; } .muted-3-color { color: var(--main-color); } /*手机优化*/ @media screen and (max-width:800px){.post-copyright-m-info{display:none}} ------本页内容已结束,喜欢请分享------

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档