摘要:享元模式享元模式是一种软件设计模式。符合这种场景的比如中的常量池,就是享元模式。还有中的类文件放在方法区也是享元模式的一种。
享元模式
享元模式(Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。享元模式区分了内部状态和外部状态,所以我们可以通过设置不同的外部状态使得相同的对象可以具备一些不同的特性,而内部状态设置为相同部分。在我们的程序设计过程中,我们可能会需要大量的细粒度对象来表示对象,如果这些对象除了几个参数不同外其他部分都相同,这个时候我们就可以利用享元模式来大大减少应用程序当中的对象。如何利用享元模式呢?这里我们只需要将他们少部分的不同的部分当做参数移动到类实例的外部去,然后再方法调用的时候将他们传递过来就可以了。
现在假设一个一个情景, 有男女服装个100套, 需要租模特来试穿衣服, 传统做法就是男女各找100个模特试穿每一见衣服
// 雇佣模特 let HireModel = function(sex,clothes){ this.sex = sex; this.clothes = clothes; }; HireModel.prototype.wearClothes = function(){ console.log(this.sex + "试穿" + this.clothes); }; /*******试穿**********/ for(let i=0;i<100;i++){ let model = new HireModel("male","第"+i+"款男衣服"); model.wearClothes(); } for(let i=0;i<100;i++){ let model = new HireModel("female","第"+i+"款女衣服"); model.wearClothes(); }
享元模式可以简单的理解为 单例模式 + 工厂模式 + 管理器 , 管理器对外部状态进行管理组合成完整的对象
结构:采用享元模式则只需要男女模特各一名, 试穿所有衣服
//雇佣模特 var HireModel = function(sex){ //内部状态是性别 this.sex = sex; }; HireModel.prototype.wearClothes = function(clothes){ console.log(this.sex+"穿了"+clothes); }; //工厂模式,负责造出男女两个模特 var ModelFactory = (function(){ var cacheObj = {}; return { create:function(sex){ //根据sex分组 if(cacheObj[sex]){ return cacheObj[sex]; } else { cacheObj[sex] = new HireModel(sex); return cacheObj[sex]; } } }; })(); //模特管理 var ModelManager = (function(){ //容器存储:1.共享对象 2.外部状态 var vessel = {}; return { add:function(sex,clothes,id){ //造出共享元素:模特 var model = ModelFactory.create(sex); //以id为键存储所有状态 vessel[id] = { model:model, clothes:clothes }; }, wear:function(){ for(var key in vessel){ //调用雇佣模特类中的穿衣服方法。 vessel[key]["model"].wearClothes(vessel[key]["clothes"]); } } }; })(); /*******通过运行时间测试性能**********/ for(var i=0;i<100;i++){ ModelManager.add("male","第"+i+"款男衣服",i); ModelManager.add("female","第"+i+"款女衣服",i); } ModelManager.wear();
由于享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上来说更加复杂化了。
为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。使用场景:
对象的属性可以拆分
对象的变量是一部分可以变动另外享元模式其实使用的非常广泛。只要对象处于反复创建的环境中,并且每个对象有部分属性是共通的那么我们就能使用享元模式。符合这种场景的比如 java 中 string 的常量池,就是享元模式。还有jDK中的类文件放在方法区也是享元模式的一种。在互联网应用中通常我们描述的叫XX池的东西都是使用的享元模式。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/107610.html
摘要:享元模式通过分析应用程序的对象,将其解析为内在数据和外在数据,减少对象数量,从而提高程序的性能。通过这种方式进行事件绑定,可以减少事件处理程序的数量,这种方式叫做事件委托,也是运用了享元模式的原理。事件处理程序是公用的内在部分,每个菜单项各 github 全文地址 : YOU-SHOULD-KNOW-JS JavaScript设计模式之外观模式 概念 外观模式:为一组复杂子系统接口提...
摘要:享元模式属于结构型模式的一种,又称轻量级模式,通过共享技术有效地实现了大量细粒度对象的复用概述两种结构状态内部状态享元对象内部不随外界环境改变而改变的共享部分。 享元模式(Flyweight Pattern)属于结构型模式的一种,又称轻量级模式,通过共享技术有效地实现了大量细粒度对象的复用... 概述 两种结构状态 内部状态:享元对象内部不随外界环境改变而改变的共享部分。 外部状态...
摘要:在类似于这样的面向对象语言中,抽象类的使用在这个设计模式中非常重要。假设系统中存在大量类似的对象而导致内存消耗过高,享元模式就非常有用了。享元模式包含两种状态即属性内部状态存储于对象内部。不过与享元模式不同的是它不会区分内部状态和外部状态。 模式8-模版方法模式 模版方法模式是一种基于继承的设计模式。主要由两部分构成: 抽象父类:包含子类的算法框架和一些通用的具体方法; 具体实现的子...
阅读 3547·2023-04-26 02:05
阅读 1912·2021-11-19 11:30
阅读 4155·2021-09-30 09:59
阅读 3149·2021-09-10 10:51
阅读 2572·2021-09-01 10:30
阅读 1443·2021-08-11 11:20
阅读 2575·2019-08-30 15:54
阅读 525·2019-08-30 10:49