iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何理解Java设计模式的享元模式
  • 574
分享到

如何理解Java设计模式的享元模式

2023-06-25 13:06:10 574人浏览 独家记忆
摘要

本篇内容介绍了“如何理解Java设计模式的享元模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、引言大家都知道单例模式,通过一个全局变量

本篇内容介绍了“如何理解Java设计模式的享元模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、引言

大家都知道单例模式,通过一个全局变量来避免重复创建对象而产生的消耗,若系统存在大量的相似对象时,又该如何处理?参照单例模式,可通过对象池缓存可共享的对象,避免创建多对象,尽可能减少内存的使用,提升性能,防止内存溢出。

软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然而享元模式可以解决这个问题,下面具体看看享元模式是如何去解决这个问题的。

二、什么是享元模式

定义:共享元对象,运用共享技术有效地支持大量细粒度对象的复用。如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用创建新的对象。

享元模式是为数不多的、只为提升系统性能而生的设计模式,主要作用就是复用大对象(重量级对象),以节省内存空间和对象创建时间。

面向对象可以非常方便的解决一些扩展性的问题,但是在这个过程中系统务必会产生一些类或者对象,如果系统中存在对象的个数过多时,将会导致系统的性能下降。对于这样的问题解决最简单直接的办法就是减少系统中对象的个数。享元模式提供了一种解决方案,使用共享技术实现相同或者相似对象的重用。也就是说实现相同或者相似对象的代码共享。

所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现对象的多次复用。

共享模式是支持大量细粒度对象的复用,所以享元模式要求能够共享的对象必须是细粒度对象。

首先了解两个概念:内部状态、外部状态。

内部状态:在享元对象内部不随外界环境改变而改变的共享部分。

外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。

由于享元模式区分了内部状态和外部状态,所以我们可以通过设置不同的外部状态使得相同的对象可以具备一些不同的特性,而内部状态设置为相同部分。

在我们的程序设计过程中,我们可能会需要大量的细粒度对象来表示对象,如果这些对象除了几个参数不同外其他部分都相同,这个时候我们就可以利用享元模式来大大减少应用程序当中的对象。

如何利用享元模式呢?这里我们只需要将他们少部分的不同的部分当做参数移动到类实例的外部,然后在方法调用的时候将他们传递过来就可以了。这里也就说明了一点:内部状态存储于享元对象内部,而外部状态则应该由客户端来考虑。

三、享元模式的结构

如何理解Java设计模式的享元模式

1.Flyweight: 享元接口,所有具体享元类的超类或接口,通过该接口Flyweight可以接受并作用于外部状态。通过该接口可以传入外部的状态,在享元对象的方法处理中可能会使用这些外部的数据。

2.ConcreteFlyweight: 具体的享元实现对象,指定内部状态,必须是共享的,需要封装Flyweight的内部状态。

3.UnshareConcreteFlyweight: 非共享的享元实现对象,并不是所有的Flyweight实现对象都需要共享。非共享的享元实现对象通常是对享元对象的组合对象。

4.FlyweightFactoty: 享元工厂类,主要用来创建并管理共享的享元对象,并对外提供访问共享享元的接口。当用户请求一个Flyweight时,FlyweightFactory就会提供一个已经创建的Flyweight对象或者新建一个(如果不存在)。

5.Client: 享元客户端,主要的工作就是维持一个对Flyweight的引用,计算或存储享元的外部状态,当然这里可访问共享和不共享的Flyweight对象。

享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。

四、享元模式和单例模式的异同

享元模式可以再次创建对象 也可以取缓存对象

单例模式则是严格控制单个进程中只有一个实例对象

享元模式可以通过自己实现对外部的单例 也可以在需要的使用创建更多的对象

单例模式是自身控制 需要增加不属于该对象本身的逻辑

两者都可以实现节省对象创建的时间 ThreadPool 线程池数据库连接池 都有使用享元模式

五、享元模式的优缺点

优点:

  • 可以极大减少内存中对象的数量,使得相同或相似对象在内存中只保存一份,从而可以节约系统资源,提高系统性能。

  • 享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享。

缺点:

  • 享元模式使得系统变得复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化。

  • 为了使对象可以共享,享元模式需要将享元对象的部分状态外部化,而读取外部状态将使得运行时间变长。

六、享元模式的使用场景

  • 一个系统有大量相同或者相似的对象,造成内存的大量耗费。

  • 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。

  • 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。

七、享元模式的实现

public abstract class abStudent    {        public string Name;        public string schName;        public string Sex;        public abStudent()        {            schName = "吉林大学";            Sex = "男";        }        public override string ToString()        {            return string.FORMat("我叫{0},性别{1},在读学校{2}", Name, Sex, schName);        }    }
public class Student:abStudent    {        public Student(string name)        {            Name = name;        }    }
public class School    {        private Dictionary<int, Student> StudentList;        public School()        {            StudentList = new Dictionary<int, Student>();            StudentList.Add(1, new Student("张三"));            StudentList.Add(2, new Student("李四"));        }        public Student GetStudent(int num)        {            return StudentList[num] as Student;        }    }
class Program    {        static void Main(string[] args)        {            School school = new School();            Student student = school.GetStudent(1);            Console.WriteLine(student.ToString());            student = school.GetStudent(2);            Console.WriteLine(student.ToString());            Console.ReadKey();        }    }

“如何理解Java设计模式的享元模式”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何理解Java设计模式的享元模式

本文链接: https://www.lsjlt.com/news/305050.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何理解Java设计模式的享元模式
    本篇内容介绍了“如何理解Java设计模式的享元模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、引言大家都知道单例模式,通过一个全局变量...
    99+
    2023-06-25
  • 深入理解Java设计模式之享元模式
    目录一、引言二、什么是享元模式三、享元模式的结构四、享元模式和单例模式的异同五、享元模式的优缺点六、享元模式的使用场景七、享元模式的实现八、总结一、引言 大家都知道单例模式,通过一个...
    99+
    2024-04-02
  • Java设计模式之享元模式
    本文通过优化买票的重复流程来说明享元模式,为了加深对该模式的理解,会以String和基本数据类型的包装类对该模式的设计进一步说明。 读者可以拉取完整代码到本地进行学习,实现代码均测试...
    99+
    2024-04-02
  • Java设计模式之享元模式示例详解
    目录定义原理类图案例需求方案:享元模式分析总结定义 享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实...
    99+
    2024-04-02
  • javascript设计模式之享元模式
    目录一. 认识享元模式二. 代码具体实现1. 不使用享元模式实现上述案例2. 使用享元模式重构上述代码3. 享元模式的状态三. 享元模式实际应用扩展:再谈内部状态和外部状态四. 对象...
    99+
    2024-04-02
  • 好程序员分享java设计模式之享元模式
      好程序员分享java设计模式之享元模式,享元模式有点类似于单例模式,都是只生成一个对象被共享使用。享元模式主要目的就是让多个对象实现共享,减少不必要的内存消耗,将多对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低...
    99+
    2023-06-02
  • Java结构型设计模式之享元模式示例详解
    目录享元模式概述目的应用场景优缺点主要角色享元模式结构内部状态和外部状态享元模式的基本使用创建抽象享元角色创建具体享元角色创建享元工厂客户端调用总结享元模式实现数据库连接池创建数据库...
    99+
    2024-04-02
  • 如何理解Java设计模式的组合模式
    这篇文章主要介绍“如何理解Java设计模式的组合模式”,在日常操作中,相信很多人在如何理解Java设计模式的组合模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的组合模式”的疑惑有所...
    99+
    2023-06-25
  • 如何理解Java设计模式的桥接模式
    这篇文章主要讲解了“如何理解Java设计模式的桥接模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的桥接模式”吧!一、什么是桥接模式桥接模式(Bridge Patt...
    99+
    2023-06-25
  • 如何理解Java设计模式的状态模式
    本篇内容介绍了“如何理解Java设计模式的状态模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是状态模式定义:当一个对象的内在状态...
    99+
    2023-06-25
  • 如何理解Java设计模式的装饰模式
    这篇文章主要介绍“如何理解Java设计模式的装饰模式”,在日常操作中,相信很多人在如何理解Java设计模式的装饰模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的装饰模式”的疑惑有所...
    99+
    2023-06-25
  • 如何理解Java设计模式的命令模式
    本篇内容主要讲解“如何理解Java设计模式的命令模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Java设计模式的命令模式”吧!一、什么是命令模式命令模式是一个高内聚的模式,其定义为:...
    99+
    2023-06-25
  • 如何理解Java设计模式的单例模式
    这篇文章主要讲解了“如何理解Java设计模式的单例模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的单例模式”吧!一、什么是单例模式单例模式是一种常用的软件设计模式...
    99+
    2023-06-25
  • 如何理解Java设计模式的解释器模式
    本篇内容主要讲解“如何理解Java设计模式的解释器模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Java设计模式的解释器模式”吧!一、什么是解释器模式定义:给定一个语言,定义一个文法...
    99+
    2023-06-25
  • Python设计模式结构型享元模式
    目录一、享元模式二、应用场景三、代码示例一、享元模式 享元,可理解为 Python 中的元类、最小粒度的类,系统中存在大量的相似对象时,可以选择享元模式提高资源利用率。 享元具有两种...
    99+
    2024-04-02
  • JavaScript设计模式之性能优化模式享元模式
    目录前言案例享元设计模式的状态前言 享元设计模式是用于性能优化的模式,这种设计模式的核心在于可以共享技术并支持对大量细分过后的对象进行调整,如果系统    中因为...
    99+
    2024-04-02
  • 如何理解Java设计模式的职责链模式
    本篇内容介绍了“如何理解Java设计模式的职责链模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是职责链模式客户端发出一个请求,链...
    99+
    2023-06-25
  • 每天一个设计模式之享元模式
    作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) 个人技术博客-godbmw.com 欢迎来玩! ...
    99+
    2023-01-31
    模式
  • javascript设计模式的享元模式怎么实现
    这篇文章主要介绍“javascript设计模式的享元模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript设计模式的享元模式怎么实现”文章能帮助大家解决问题。一. 认识享元模...
    99+
    2023-06-26
  • Java设计模式--代理模式
    目录1、代码设计的代理模式2、计算机网络中的正向代理和反向代理总结1、代码设计的代理模式 代理模式属于构建型模式(Proxy),提供了对目标对象的一种访问方式; 即通过代理对象访问...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作