首页 > 其他分享 >结构型模式-享元模式

结构型模式-享元模式

时间:2023-11-10 10:24:05浏览次数:24  
标签:享元 状态 角色 对象 Character 模式 共享 结构型

1 什么是享元模式

享元模式(Flyweight Pattern)是一种以共享对象来减少内存使用和提高性能的设计模式。在享元模式中,通过共享尽可能多的相似对象来减少系统中对象的数量。这样可以节省内存和减少对象的创建和销毁所带来的开销。
享元模式的核心思想是将对象分为两个部分:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态是对象共享的部分,在享元模式中被存储于享元对象内部,而外部状态是对象的变化部分,由客户端在使用时传递给享元对象

2 举个例子

下面以一个简单的游戏角色创建为例来说明享元模式。假设有一个游戏中的角色类Character,它有内部状态type表示角色的类型(比如战士、法师等),而外部状态position表示角色的位置。
首先,我们创建一个享元工厂(Flyweight Factory)来管理和共享角色对象。享元工厂中有一个集合用于存储已经创建的角色对象,以内部状态作为键值。当需要创建角色时,首先检查集合中是否存在特定类型的角色对象,如果存在则直接返回共享的对象,如果不存在则创建新的对象并存储到集合中,然后返回该对象。

class Character
{
public:
    Character(const std::string& type) : type_(type) {}

    void Display(const std::string& position)
    {
        std::cout << "Character Type: " << type_ << ", Position: " << position << std::endl;
    }

private:
    std::string type_;
};

class CharacterFactory
{
public:
    Character* GetCharacter(const std::string& type)
    {
        if (characters_.find(type) != characters_.end())
        {
            return characters_[type];
        }

        Character* newCharacter = new Character(type);
        characters_[type] = newCharacter;
        return newCharacter;
    }

private:
    std::map<std::string, Character*> characters_;
};

客户端代码使用享元工厂来获取角色对象,并传递外部状态(位置):

int main()
{
    CharacterFactory characterFactory;

    Character* warrior = characterFactory.GetCharacter("Warrior");
    warrior->Display("X:10, Y:20");

    Character* mage = characterFactory.GetCharacter("Mage");
    mage->Display("X:30, Y:40");

    // 共享对象
    Character* warrior2 = characterFactory.GetCharacter("Warrior");
    warrior2->Display("X:50, Y:60");

    delete warrior;
    delete mage;
    delete warrior2;

    return 0;
}

在上述例子中,即使创建了多个战士角色对象,由于它们有相同的内部状态(“Warrior”),所以只有一个对象被真正创建,其他的对象直接引用已有的对象进行共享。这样可以有效地减少内存占用。

3 总结

享元模式通过共享对象来节省内存和提高性能,适用于有大量相似对象的场景,其中对象可以分为内部状态和外部状态。这样,通过共享相同的内部状态,可以减少对象的数量,并将对象的变化部分作为外部状态来传递和管理。

标签:享元,状态,角色,对象,Character,模式,共享,结构型
From: https://www.cnblogs.com/luoxiang/p/17823457.html

相关文章

  • 解锁设计模式的神秘面纱:编写无懈可击的代码之单例设计模式
    前言单例设计模式是23种设计模式中最常用的设计模式之一,无论是三方类库还是日常开发几乎都有单例设计模式的影子。单例设计模式提供了一种在多线程情况下保证实例唯一性的解决方案。单例设计模式虽然简单,但是实现方案却非常多,大体上有以下7种最常见的方式。饿汉模式所谓饿汉式,就是......
  • 工厂方法模式
    [实验任务]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。 publicinterfaceEncryption{Stringencrypt(Stringtext);Stringdecrypt(Stringciph......
  • python升级到3.12版本, 开发模式安装包, 在vscode下Pylance无法解析的问题处理
    问题描述在python3.11版本下开发python库,为方便调测,使用开发模式安装包.使用如下命令:pipinstall-e.其中-e参数表示开发模式下安装python包,它并没有把包相关文件拷贝到site-packages目录,而是创建一个链接指向当前的开发库.这样,当自己开发的包修改后会立即生效,......
  • Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍
    Go接口:Go中最强大的魔法,接口应用模式或惯例介绍目录Go接口:Go中最强大的魔法,接口应用模式或惯例介绍一、前置原则二、一切皆组合2.1一切皆组合2.2垂直组合2.2.1第一种:通过嵌入接口构建接口2.2.2第二种:通过嵌入接口构建结构体类型2.2.3第三种:通过嵌入结构体类型构建新结构......
  • flutter 运行的四种模式
    Debug(调试)模式1、这是开发Flutter应用程序时最常用的模式。可以在真机和模拟器上同时运行。重要用于开发和调试阶段。2、可以进行热重载,即在不重新启动应用程序的情况下实时更新代码。3、应用程序会包含用于调试和开发的额外信息和工具(debugging信息、debuggeraids(比如......
  • Kubernetes日志采集Sidecar模式介绍
    Kubernetes(K8S)作为CNCF(cloudnativecomputingfoundation)的一个核心项目,背靠Google和Redhat的强大社区,近两年发展十分迅速,在成为容器编排领域中领导者的同时,也正在朝着PAAS底座标配的方向发展。日志采集方式日志作为任一系统不可或缺的部分,在K8S的官方文档中也介绍了多种的日......
  • java的设计模式之抽象工厂模式
    抽象工厂模式(AvstractFactory)在某些情况下,需要创建一系列相关或相互依赖的对象,这些对象属于一组相关的产品族。同时,系统需要保证这些产品族之间的一致性。如果直接在代码中创建这些对象,会使得代码与具体产品的细节紧密耦合,不利于后续的扩展和维护。抽象工厂模式提供了一个接口,用于......
  • 自建站外贸收款方式?海洋建站支持什么收款模式
    在开展外贸业务时,自建站点是一个常见的选择,但关于收款方式的选择一直是外贸企业关注的焦点之一。本文将探讨自建站外贸收款方式的重要性以及海洋建站支持的收款模式,以帮助您更好地管理国际交易的资金流动。1.选择适合您业务的外贸收款方式在自建外贸网站时,选择合适的外贸收款方式......
  • Xcode自动管理签名模式下更新PP文件
    1、Xcode切换到相应的Target,选择到Signing&Capabilities,找到ProvisioningProfileManagedProfile,旁边有一个Info符号,点击,展示PP文件详情,然后拖动左上角的PP文件图标到桌面,主要是为了获取该PP文件的名字。(如下图) 2、打开 ~/Library/MobileDevice/ProvisioningProfi......
  • k8s通过sidecar模式收集pod的容器日志至ELK
    架构:已完成的部署1、ES集群及kibana部署 https://blog.51cto.com/yht1990/60809812、kafaka+zookeeper集群 https://blog.51cto.com/yht1990/6081518准备sidecar镜像(filebeat)找一台服务器打镜像[root@yw-testfilebeat]#catDockerfileFROMdocker.elastic.co/beats/f......