[设计模式] javascript 之 享元模式;

享元模式说明

定义:用于解决一个系统大量细粒度对象的共享问题:

关健词:分离跟共享;

说明: 享元模式分单纯(共享)享元模式,以及组合(不共享)享元模式,有共享跟不共享之分;单纯享元模式,只包含共享的状态,可共享状态是不可变,不可修改的,这是享元的内部状态;当然有外部状态就有外部状态,外部状态是可变的,不被共享,这个外部状态由客户端来管理,是可变化的;外部状态与内部状态是独立分开的,外部状态一般作为参数传入享元对象内,但不会影响内部状态的值;外部状态,一用用于获取共享的享元对象,或多或少与内部状态有点关联;比如从用户数据表中获取数据,传入一个外部变量用户名,再根据这个用户名,获取该用户所有对象状态信息;

组合享元模式,配置组合模式来使用,共享部分只做个叶子节点,而组合部分是不必共享的,因为共组部分的子叶节点元素已经被缓存,组合部分相当一个分组分类的作用;

享元模式一般会与工厂模式相结合使用,用于管理缓存的创建跟维护,享元共享元素的创建一般在工厂类里创建;

享元模式主要用于对象的共享,使具有相似对象,或对象间具有太多相似细粒度的状态,能共享已经创建的对象,减少对象的创建,减少对内存的占用,提升优化性能;

一种场景:

享元模式结构图:

像第一张的情况,就可以使用享元模式,因为后两排的状态组合,可能在实体对应中,多次存在,这时就可以使用享元的共享特性,来减少对象的创建,如有相同的状态或组合,就可以获取缓存的状态,减少对象重复创建,减少内存占用;

实例场景:

1>. 系统各种角色权限分配;

2>. 系统出现很多种状态,或组合状态需要对应的,而且这种对应,可以发生很多种其他类型对象上面的,就可以使用享元模式;

实例源码: 单纯(共享)享元

1. 自定义的 JavaScript Hashtable:

function Hashtable() {
    this.values = [];
}

Hashtable.prototype.getJson = function() {
  return this.values;
}

Hashtable.prototype.add = function(key, value) {
    if (!this.contain(key)) {
        this.values.push({key:key, value:value});
    }
}

Hashtable.prototype.contain = function(key) {
    for (idx in this.values) {
        var json = this.values[idx];
        if (json.key == key) {
            return true;
        }
    }
    return false;
}

Hashtable.prototype.get = function(key) {
    var result;
    for (idx in this.values) {
        var json = this.values[idx];
        if (json.key == key) {
            result = json;
            break;
        }
    }
    return result;
}

Hashtable.prototype.delete = function(key) {
    for (idx in this.values) {
        var json = this.values[idx];
        if (json.key == key) {
            delete this.values[idx];
            break;
        }
    }
}

Hashtable.prototype.set = function(key, value) {
    if (this.contain(key)) {
        this.delete(key);
        this.values.push({key:key,value:value});
    }
}

2. 享元方法:

function Flyweight(one) {
    this.stateOne = one;
}

Flyweight.prototype.operate = function(){   var date = new Date();
    console.log(this.stateOne + ‘-‘ + Math.random());
};

这里可以处理传进来的参数的一些逻辑,也可以初始化从数据库里提取数据缓存保存;

3. 享元工厂:

function FlyweightFactory(){
    var hash = new Hashtable();
}

FlyweightFactory.prototype.getFlyweight = function(state) {
    var flyweight;
    if (hash.contain(state)) {
        flyweight = hash.get(state);
    } else {
        flyweight = new Flyweight(state);
        hash.add(state, flyweight);
    }
    return flyweight;
}

4. Client 使用:

//Client 

var factory = new FlyweightFactory();
var fly1, fly2, fly3;

fly1 = factory.getFlyweight(‘AABB‘);
fly2 = factory.getFlyweight(‘CCDD‘);
fly3 = factory.getFlyweight(‘CCDD‘);

fly1.operate();
fly2.operate();
fly3.operate();

输出:

AABB-0.8621504916809499

CCDD-0.7498800195753574

CCDD-0.7498800195753574

复合享元模式

1. 复合享元

function UnShareFlyweight() {
    this.state = ‘‘;
    this.hash = new Hashtable();
}

UnShareFlyweight.prototype.add = function(key, flyweight) {
    this.hash.add(key, flyweight);
}

UnShareFlyweight.prototype.operate = function(state) {
    var flag = false;   /*
    for (idx in this.hash) {
        var fly = this.list[idx];
        if (fly.stateOne == state) {
            flag = true;        break;
        }
    }   */     flag = this.hash.contain(state);
    flag ? console.log(‘Exists‘) : console.log(‘Not Exists‘);
}

5. 在修改添加在享元工厂的组合方法:

function FlyweightFactory(){
    var hash = new Hashtable();
}

FlyweightFactory.prototype.getFlyweight = function(state) {
    var flyweight;
    if (hash.contain(state)) {
        flyweight = hash.get(state);
    } else {
        flyweight = new Flyweight(state);
        hash.add(state, flyweight);
    }
    return flyweight;
}

FlyweightFactory.prototype.getComposite = function(list) {
    var unFly = new UnShareFlyweight();
    var flyweight, state;
    for (idx in list) {
        state = list[idx];
        flyweight = this.getFlyweight(state);
        unFly.add(state, flyweight);
    }
}

FlyweightFactory.prototype.print = function() {
    var jsons = this.hash.getJson();
    for (json in jsons) {
        json.value.operate();
    }
}

3. Client 使用:

var states = [‘AABB‘, ‘CDCD‘, ‘AABB‘, ‘CCDD‘];

var factory = new FlyweightFactory();
factory.getComposite(states);

factory.print();

输出:

AABB-0.8749617566354573

CDCD-0.6991151459515095

CCDD-0.9891050879377872

享元模式其他说明

总体来说,享元模式用于减少对象的重复创建,用于减少内存使用,提升性能的结构型模式:

它涉及三个模式:享元模式,工厂模式,组合模式;

对于处理多对多对应而产生的一些数据缓存存储,是一个不错的选择!

时间: 2024-07-31 21:18:58

[设计模式] javascript 之 享元模式;的相关文章

大话设计模式Python实现- 享元模式

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象. 下面是一个享元模式的demo: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = 'Andy' 5 """ 6 大话设计模式 7 设计模式--享元模式 8 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象 9 对一个类进行的实例,只在第一次使用时建立,其他时候是用同一个

java设计模式 GOF23 11 享元模式

一.享元模式简介 如果有很多相同或者相似的对象可以使用享元模式,从而节约内存. 二.关键点 享元对象需要区分内部状态和外部状态. 内部状态:可以共享,不会随着外部状态改变. 外部状态:不可以共享,随外部状态改变. 享元共享类实现享元池管理享元对象. 三.简单实现 package com.lz.flyWeight; /* * 享元模式 * 内部状态 * 模拟棋盘,因为一盘棋其中棋子的颜色都一样 * 只有位置不一样,所以可以将颜色共享,这样可以节省内存空间 * 棋盘接口 */ interface C

Java设计模式之《享元模式》及应用场景

原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在. 享元模式有点类似于单例模式,都是只生成一个对象来被共享使用.这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我们将这些对象的公共部分,或者说是不变化的部分抽取出来形成一个对象.这个对象就可以避免到修改的问题. 享元的目的是为了减少不会要额内存消耗,将多个对同一对象的访

设计模式--13、享元模式

享元模式: 先让我们来看一个应用场景: 比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象.如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了.那么如果要是每个字母都共享一个对象,那么就大大节约了资源.也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象. 在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式.Flyw

《Java设计模式》之享元模式

Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. Java中的String类型 在JAVA语言中,String类型就是使用了享元模式.String对象是final类型,对象一旦创建就不可改变.在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝.Stri

再战设计模式(十一)之享元模式

享元模式 场景: 内存属于稀缺资源,不要随便浪费.如果有很多个完全相同或相似的 对象,我们可以通过享元模式,节省内存. 核心: 本质:享元模式以共享的方式高效地支持大量细粒度对象的重用 享元对象能做到共享的关键是区分了内部状态和外部状态 内部状态:可以共享,不会随环境变化而改变 外部状态:不可以共享,会随环境变化而改变 现在有个需求,需要为围棋设置一个程序,那么围棋的棋子改如何设计?总共有很多黑子和白子,难道我们需要为每一个棋子生成一个对象吗? 显然这样的设计是不合理的.这个时候我们就可以用到享

Java设计模式:Flyweight(享元)模式

概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对象则创建新对象,从而减少系统中重复创建对象实例的性能和内存消耗. 享元模式将对象的信息分为两个部分:内部状态(Internal State)和外部状态(External State).内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变.外部状态是随环境改变而改变的.不可共享的

Java描述设计模式(18):享元模式

本文源码:GitHub·点这里 || GitEE·点这里 一.使用场景 应用代码 public class C01_InScene { public static void main(String[] args) { String c0 = "cicada" ; String c1 = "cicada" ; System.out.println(c0 == c1); // true } } String类型就是使用享元模式.String对象是final类型,对象一旦

设计模式学习笔记--享元模式

1 using System; 2 3 namespace FlyWeight 4 { 5 /// <summary> 6 /// 作者:bzyzhang 7 /// 时间:2016/6/2 7:21:28 8 /// 博客地址:http://www.cnblogs.com/bzyzhang/ 9 /// FlyWeight说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址 10 /// </summary> 11 public abstract cla