Flyweight是一种共享数据内存的模式。

Flyweight模式是将一些公有属性从个人中剔除,放在共享的对象当中。

下面以一个项目实例,通过不断的改进,以显示Flyweight模式的优点。

现在我们想做一个电脑生产程序,用以生产电脑,电脑的一般有生产商,机型,CPU类型,内存,和型号。

我们的最初代码如下:

// 电脑类
var Computer = function (make, model, processor, memory, tag) {
this.make = make;
this.model = model;
this.processor = processor;
this.memory = memory;
this.tag = tag;
} // 测试生产两台不同的电脑
var computer1 = new Computer("Dell", "Studio XPS", "Intel", "4G", "Y755P");
var computer2 = new Computer("Dell", "Studio XPS", "Intel", "8G", "Y755P"); console.log(computer1);
console.log(computer2);

对代码简单的分析,我们可以发现,两台不同的电脑的前三个属性,品牌,机型和CPU都是一样的。而我们却每次都为其重新定义赋值。

试想一下,如果这样有一百上千台的电脑,那对内存来说就是一笔不小的开销。我们可不可以将这些相同的属性共有化呢?

// 电脑类
var Computer = function (make, model, processor, memory, tag) { // 引用共享单元中的数据
if(make + model + processor === "DellStudio XPSIntel"){
this.flyweight = flyweight1;
}
this.memory = memory;
this.tag = tag;
} // 共享单元
var flyweight = {
make: 'Dell',
model: "Studio XPS",
processor: "Intel"
} // 测试
var computer1 = new Computer("Dell", "Studio XPS", "Intel", "4G", "Y755P");
var computer2 = new Computer("Dell", "Studio XPS", "Intel", "8G", "Y755P"); console.log(computer1);
console.log(computer2);

在这里我们将共有几乎固定的属性从类中剔除,建立了一个很生硬的对象flyweight以存放他们用来共享。就这样,虽然新生产每台电脑都有5个属性,但其中前三个属性都是共享flyweight对象中的数据。节省了内存开支。尤其这样前三个属性相同的电脑比较多时,这已经就是Flyweight的精髓了,只是我们的模式还很初步。

继续我们的思路,如果我们需要再多一个共享单元呢,难道重新创建一个对象?不是的。此时我们用一个类创建各种享元,且用一个对象作为列表来存放来会更好一些。

// 享元列表
var flyweightList = {}; var Computer = function (make, model, processor, memory, tag) { if(flyweightList[make+model+processor]){ // 享元列表中存在,直接引用
this.flyweight = flyweightList[make+model+processor];
}else { // 不存在,创建新的享元对象并存入列表中
this.flyweight = new Flyweight(make, model, processor);
flyweightList[make+model+processor] = this.flyweight;
} this.memory = memory;
this.tag = tag;
} // 享元类
function Flyweight (make, model, processor) { this.make = make;
this.model = model;
this.processor = processor; }; var computer1 = new Computer("Dell", "Studio XPS", "Intel", "4G", "Y755P");
var computer2 = new Computer("Dell", "Studio XPS", "Intel", "8G", "Y755P"); var computer3 = new Computer("HP", "Envy", "Intel", "2G", "801632312"); console.log(computer1);
console.log(computer2);
console.log(computer3);

这样其实已经很不错了,只是享元列表作为一个全局变量似乎不太好,在比较高级的享元模式运用,我们还需要一些其他的方法,如获取享元中的数量等。进一步我们可以用模块模式将享元包裹一下。

function Flyweight (make, model, processor) {

    this.make = make;
this.model = model;
this.processor = processor; }; var FlyweightFactory = (function(){ // 私有
var flyweightList = {}; return { // 新增享元
addFlyweight: function (make, model, processor){
if(!flyweightList[make+model+processor]){
flyweightList[make+model+processor] = new Flyweight(make, model, processor);
}
return flyweightList[make+model+processor];
}, // 计数
count: function(){
var count = 0;
for (var f in flyweightList) count++;
return count;
}
}
})() var Computer = function (make, model, processor, memory, tag) { this.flyweight = FlyweightFactory.addFlyweight(make, model, processor)
this.memory = memory;
this.tag = tag; } var computer1 = new Computer("Dell", "Studio XPS", "Intel", "4G", "Y755P");
var computer2 = new Computer("Dell", "Studio XPS", "Intel", "8G", "Y755P");
var computer3 = new Computer("HP", "Envy", "Intel", "2G", "801632312"); console.log(computer1);
console.log(computer2);
console.log(computer3);
console.log(FlyweightFactory.count())

享元是一种非常常用的设计模式,对性能的优化有很大的作用。

javascript模式——Flyweight的更多相关文章

  1. 享元模式-Flyweight(Java实现)

    享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...

  2. javascript 模式(1)——代码复用

    程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ...

  3. 【读书笔记】读《JavaScript模式》 - 函数复用模式之现代继承模式

    现代继承模式可表述为:其他任何不需要以类的方式考虑得模式. 现代继承方式#1 —— 原型继承之无类继承模式 function object(o) { function F() {}; F.protot ...

  4. 【读书笔记】读《JavaScript模式》 - 函数复用模式之类式继承模式

    实现类式继承的目标是通过构造函数Child()获取来自于另外一个构造函数Parent()的属性,从而创建对象. 1.类式继承模式#1 —— 默认方式(原型指向父函数实例) function Paren ...

  5. 二十四种设计模式:享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...

  6. 初涉JavaScript模式系列 阶段总结及规划

    总结 不知不觉写初涉JavaScript模式系列已经半个月了,没想到把一个个小点进行放大,竟然可以发现这么多东西. 期间生怕对JS的理解不到位而误导各位,读了很多书(个人感觉JS是最难的oo语言),也 ...

  7. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  8. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  9. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...

随机推荐

  1. Eclipse安装Vim——viPlugin插件

    1.下载viPlugin: http://www.viplugin.com/files/viPlugin_2.14.0.zip 2.安装 解压后有两个文件夹: features 和 plugins 把 ...

  2. Mysql 复制表结构 及其表的内容

    顺便转一下Mysql复制表结构.表数据的方法: 1.复制表结构及数据到新表CREATE TABLE 新表 SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们 ...

  3. 配置元素customErrors

    Asp.net配置文件的配置方式,其实在MSDN里面是写得最清楚的了.可惜之前一直未曾了解到MSDN的强大. 先贴个地址:http://msdn.microsoft.com/zh-cn/library ...

  4. winsocket <研究了一天的成果>

    首先,这都是套路( ▼-▼ ) 头文件     #include <WinSock.h> #include <Winsock2.h> 用这个,这个是升级版 各个函数解释 1.W ...

  5. CDZSC_2015寒假新人(2)——数学 B

    B - B Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  6. css布局学习笔记之position属性

    position属性用于定位元素,它的几个值分别如下: 1,static static 是默认值.任意 position: static; 的元素不会被特殊的定位.一个 static 元素表示它不会被 ...

  7. Sublime text3使用技巧及快捷键

    一.快速查找文件Crtl+P(Goto->Goto Anyghing) 在打开的搜索框中输入文件名按Enter键即可. 提示:1.支持文件夹+文件名的搜索,比如 "js/main.js ...

  8. 使用SQL脚本访问操作远程数据库

    USE [Hik] GO /****** Object: StoredProcedure [dbo].[sp_test] Script Date: 08/21/2015 09:55:21 ****** ...

  9. js倒计时 重发 效果

    <script type="text/javascript"> window.onload = function() { var wait = 60; function ...

  10. nginx+mysql+php

    根据生产环境安装操作系统(centos 6.0 64位系统),安装完成后,使用Xshell通过ssh协议连接服务器.ssh 用户名@IP+回车+输入密码后登录系统.#mkdir -p /home/to ...