首页 > 其他分享 >设计模式之-享元模式

设计模式之-享元模式

时间:2024-07-24 22:06:53浏览次数:15  
标签:享元 Coffee 对象 模式 flavor 设计模式 共享

享元模式(Flyweight Pattern) 是一种结构型设计模式,旨在有效地支持大量细粒度对象的共享。

什么是享元模式:
享元模式是一种优化性能的设计模式,其核心思想是共享对象以减少内存使用和提高性能。在享元模式中,共享的对象被称为享元,而非共享的部分被称为外部状态。享元对象包含内部状态和外部状态,内部状态是可以共享的,外部状态则是不可共享的。

主要解决什么问题:
享元模式主要解决的问题是在应用程序中需要创建大量的相似对象时,通过共享内部状态来减少对象的数量,节省内存空间和提高性能。

在什么时候需要使用享元模式:

  • 当系统中存在大量相似对象,且这些对象的大部分状态可以共享时,可以考虑使用享元模式来减少对象的数量。
  • 当需要优化系统性能,减少内存占用时,可以使用享元模式来共享对象。

优点:

  • 减少内存占用: 通过共享内部状态,减少相似对象的数量,节省内存占用。
  • 提高性能: 减少对象数量可以提高系统性能,减少对象的创建和销毁所带来的开销。

缺点:

  • 增加复杂性: 享元模式可能会增加系统的复杂性,需要对内部状态和外部状态进行区分和管理。
  • 可能引入线程安全问题: 当享元对象被多个线程共享时,需要考虑线程安全性。

举例说明:

import java.util.HashMap;

// 享元工厂
class CoffeeFlyweightFactory {
    private HashMap<String, Coffee> flavors = new HashMap<>();

    public Coffee getCoffeeFlavor(String flavor) {
        Coffee coffee = flavors.get(flavor);
        if (coffee == null) {
            coffee = new Coffee(flavor);
            flavors.put(flavor, coffee);
        }
        return coffee;
    }

    public int getTotalCoffeeFlavors() {
        return flavors.size();
    }
}

// 享元对象
class Coffee {
    private final String flavor;

    public Coffee(String flavor) {
        this.flavor = flavor;
    }

    public String getFlavor() {
        return flavor;
    }
}

public class FlyweightExample {
    public static void main(String[] args) {
        CoffeeFlyweightFactory factory = new CoffeeFlyweightFactory();

        Coffee coffee1 = factory.getCoffeeFlavor("Cappuccino");
        Coffee coffee2 = factory.getCoffeeFlavor("Latte");
        Coffee coffee3 = factory.getCoffeeFlavor("Cappuccino");

        System.out.println("Total Coffee Flavors: " + factory.getTotalCoffeeFlavors());
    }
}

在这个示例中,CoffeeFlyweightFactory充当享元工厂,负责创建和管理享元对象Coffee

当客户端需要享元模式(Flyweight Pattern)是一种结构型设计模式,用于最大程度地减少内存使用或计算开销,通过共享尽可能多的相似对象来提高系统性能。

最后: 发现一个AI漫画图片生成工具--AI Anime Generator,体验地址:https://aianimegenerator.top

标签:享元,Coffee,对象,模式,flavor,设计模式,共享
From: https://www.cnblogs.com/wenv/p/18321873

相关文章

  • redis的持久化和集群模式
    redis的持久化什么是持久化把内存中的数据存储到磁盘的,同时也可以把磁盘中的数据加载到内存中redis实现持久化的方式erdis实现持久化的方式有两种:RDB、AOF第一种RDB(RedisDataBase快照模式,每隔一段时间对内存数据进行快照存储)触发方式手动触发:使用save或bgsave触发r......
  • rust 初探 -- 枚举和模式匹配
    rust初探–枚举和模式匹配定义枚举enumIpAddrKind{//将数据附加到枚举的变体中//-不需要额外使用struct//-每个变体可以拥有不同的类型以及关联的数据量V4(String),V6(String),}可以使用impl为枚举定义方法enumIpAddrKind{......
  • 【Gin】架构的精妙编织:Gin框架中组合模式的革新实践与技术深度解析(下)
    【Gin】架构的精妙编织:Gin框架中组合模式的革新实践与技术深度解析(下)大家好我是寸铁......
  • JAVA常见面试题-设计模式(单例模式实现)
    单例模式分为懒汉式与饿汉式,其中饿汉式较为常用。饿汉式publicclassSingleton{   privatestaticSingletoninstance=newSingleton();   privateSingleton(){}   publicstaticSingletongetInstance(){   returninstance; ......
  • 设计模式-代理模式(Proxy Pattern)
    设计模式-代理模式(ProxyPattern) 概要 记忆关键字:代理控制 定义:为其他对象提供一种代理以控制对这个对象的访问 分析: 1)通过代理类,给对象的行为增加辅助功能的解决方案,就是代理模式 2)在程序运行时,动态地为被代理对象生成代理类,借助编程语言当中的"反射"特性。 ......
  • 设计模式-抽象工厂模式(Abstract Factory Pattern)
    设计模式-抽象工厂模式(AbstractFactoryPattern)  概要   记忆关键词:抽象接口  定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。  分析:如果待创建的产品非常多,我们不需要为每一个产品类配上一个工厂类,而是可以把这些产品进行分组。抽象......
  • 设计模式-建造者模式(Builder)
    设计模式-建造者模式(Builder)  概要   记忆关键词:类和构造分离  定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。  分析:原型模式就是从一个样板对象中复制出一个内部属性一致的对象。它是在内存中拷贝二进制流,比new一个对象的性能......
  • 我想使用 torch DataLoader 并使用生产者/消费者模式,但它卡住了
    我想更改torchDataLoader,并在其中使用消费者/生产者模式。我有一个队列,一个线程将文件放入其中,这些项目由框架使用__getitem__使用。这是我的代码:importglobimporttimefromtorch.utils.dataimportDataLoader,Datasetimportthreadingimportqueue......
  • ESP32各型号模组进入下载模式的引脚配置及其自动下载电路
    1.自动下载电路 不同型号的ESP32模组的自动下载电路都相同,只是RST/EN,Boot引脚的引脚号不同,例如ESP32-C3的Boot脚为GPIO9而ESP32-Wroom-32的boot脚为GPIO0 上图为ESP32和ESP8265的自动下载电路2.进入下载模式的引脚配置 一般只有自动下载电路是不能在下载模式和运行模式来......
  • JS实现一个发布-订阅模式(观察者模式)
    //创建一个简单的事件中心,允许对象订阅事件、发布事件并取消订阅。//创建一个事件中心对象,IIFE,返回一个包含订阅、取消订阅和发布方法的对象constEventCenter=(function(){//存储事件及其对应的订阅者,存储事件及其对应的监听器数组constevents={}......