设计模式:享元模式

这篇具有很好参考价值的文章主要介绍了设计模式:享元模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设计模式:享元模式

设计模式:享元模式,通工-数据结构与算法C,Kotlin学习笔记,设计模式,享元模式

什么是享元模式

首先我们需要简单了解一下什么是享元模式。享元模式(Flyweight Pattern):主要用于减少创建对象的数量,以减少内存占用和提高性能。享元模式的重点就在这个享字,通过一些共享技术来减少对象的创建,实际上Java中String值的存储,Volley中的ByteArrayPool也使用到了享元模式,这对提高性能很有用。

感觉目前大部分的缓存机制都会用到享元模式。

享元模式结构图

享元模式在一般情况下可以分成四个部分,也可以大体分为两部分,分别是享元工厂类,享元(抽象)类。如果学习过池有关的概念的话,我们就可以把享元工厂类看做是一个池(Pool),享元类看做是池中的数据。

标准享元模式的结构图:
设计模式:享元模式,通工-数据结构与算法C,Kotlin学习笔记,设计模式,享元模式

可以看到除了共享的享元类之外还有一类不参与共享的享元类,因为享元模式只是使共享成为可能而不强制共享。

享元模式工作的一般流程

享元模式工作的流程和缓存机制很像(或许应该说缓存机制和它很像吗),当我们需要获取一个享元对象时享元工厂会检查其存储空间中是否已经有所需要的享元实例,如果有就将它直接返回,如果没有就创建一个并加入到享元工厂的存储空间中去。

享元模式的简单实现(Kotlin)

首先我们直接定义一个享元类:

class flyweight(val id:Int) {
    var message = "empty body"

    fun execute(){
        println(message)
    }
}

这里我们就不定义接口什么的了,直接创建一个简单的例子。这是一个享元类,它有两个参数,分别是id和message。id值是每个享元类唯一确定的一个值,相当于数据库中的主键,我们想要通过这个值来判断这个享元类是否是我们想要的实例。message对象和享元类的具体执行有关。

接着我们定义一个工厂类:

class flyweightFactory{

    val Pool = HashMap<Int,flyweight>()

    fun getFlyweight(id: Int,msg:String):flyweight{
        if (!Pool.containsKey(id)){ //如果没有找到对应的实例就新创建一个
            val newInstance = flyweight(id)
            Pool.put(id,newInstance)
        }
        return Pool.get(id)?.apply {
            message = msg
        }!!
    }

}

这个类的逻辑很简单,它内部有一个Pool变量来存储享元对象。还有一个getFlyweight方法用于获取它内部管理的享元对象,该方法有两个参数,第一个参数即为我们想要获得的享元实例的id,这是用于判断我们想要的享元实例是否存在,第二个参数将会被赋予给最后返回的享元对象的message中,用来影响享元对象的execute方法的执行结果。

内部状态和外部状态

内部状态和外部状态的概念干讲比较抽象,所以我们给完上面的简单例子之后结合来讲。首先我们联系享元模式的使用场景,其中之一就是拥有众多重复内容的对象,比如说一个ppt模板,对于ppt来说可能大部分的结构都是一致的,不变的只有上面显示的文字。这种情况下如果把ppt抽象成一个类的话,我们就可以共享它的模板,这个模板属于这个类内部的,我们称之为内部状态,一般内部状态是不会被外部调用给更改的。而ppt需要显示的文字就属于是外部状态,它取决于外部调用传入的参数。

我们可以对照上面的例子,其中显然flyweight类的id参数为内部参数,因为它一旦形成是不随外部传入的参数而改变的,这也可以看做是我们共享的东西。再抽象一点,这个execute方法也是内部状态,因为它的逻辑也不随外部参数而改变。而其中哪个message参数就是外部状态,因为它每次都会随着外部传入的参数而改变。文章来源地址https://www.toymoban.com/news/detail-712569.html

到了这里,关于设计模式:享元模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 笨蛋学设计模式结构型模式-享元模式【13】

    7.7.1概念 ​ 享元模式是通过共享对象减少内存使用,来提高程序性能。在此模式中,分为内部状态和外部状态,其中相似的对象被存储在享元对象内部,并对于所有享元对象都是相同的,且状态通常是不变的。只在需要时内部共享,而不是每次创建新的对象。而外部状态是享

    2024年01月23日
    浏览(43)
  • [设计模式 Go实现] 结构型~享元模式

    享元模式从对象中剥离出不发生改变且多个实例需要的重复数据,独立出一个享元,使多个对象共享,从而节省内存以及减少对象数量。 flyweight.go flyweight_test.go

    2024年01月16日
    浏览(37)
  • 设计模式(十二):结构型之享元模式

    设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式(七):结构型之适配器模式 设计模式(八):结构型之装

    2024年02月08日
    浏览(55)
  • 【设计模式】第13节:结构型模式之“享元模式”

    所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。 实现:通过工厂模式,在工厂类中,通过一个Map或者List来缓存已经创建好的享元对象,以达到复用的目的。把实例的共享状态和不共享状态分开。 以下是画

    2024年02月08日
    浏览(41)
  • 【Java 设计模式】结构型之享元模式

    享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少对象的数量以节省内存和提高性能。享元模式通过共享大量相似对象的状态,使得这些对象可以共享,而不需要在每个对象中都存储相同的数据。在本文中,我们将深入研究Java中享元模式的定义、结构、使用场景

    2024年01月22日
    浏览(52)
  • Java设计模式之结构型-享元模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、游戏角色 五、总结 享元模式是一种结构型设计模式,主要用于减少创建大量相似对象所占用的内存,它通过共享技术来有效支持大量细粒度的对象。 角色 描述 抽象享元角色 定义出对象的外部状

    2024年02月16日
    浏览(45)
  • 设计模式⑥ :访问数据结构

    有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写\\\"抄书\\\"系列。本系列大部分内容都是来源于《 图解设计模式》(【日】结城浩 著)。该系列文章可随意转载。 Visitor 模式:访问数据结构并处理数据 在 Visitor 模式中,数据结构

    2024年01月16日
    浏览(47)
  • 【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

    目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对

    2023年04月09日
    浏览(50)
  • 设计模式-享元模式

    享元模式(Flyweight Pattern)是一种结构型设计模式,主要用于减少创建大量相似对象对内存资源的消耗,通过共享这些对象来提高程序性能和系统资源利用率。在实际应用场景中string就是使用了享元模式,string a = “123”; string b = “123”; 我们假设有一个场景是需要创建大量的

    2024年01月24日
    浏览(41)
  • 设计模式——享元模式

    享元模式(Flyweight Pattern)是池技术的重要实现方式。 使用共享对象可以有效地支持大量的细粒度对象。 优点 可以大大减少应用程序创建对象的数量,降低程序内存占用。 缺点 提高了系统的复杂度,需要分离出享元对象的外部状态(key)和内部状态(对象属性),并且外部

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包