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. 大到可以小说的Y组合子(二)

    问:上一回,你在最后曾提到"抽象性不足",这话怎么说? 答:试想,如果现在需要实现一个其它的递归(比如:Fibonacci),就必须把之前的模式从头套一遍,然后通过fib_make ...

  2. [HeadFist-HTMLCSS学习笔记][第四章Web镇之旅]

    重要 访问一个目录,即是访问他的index <a>链接到网站,必须加http:// <a>的title属性,能预先知道链接信息 id属性 使得<a> 能再本地跳转. ...

  3. [HeadFirst-HTMLCSS学习笔记][第三章创建网页]

    一些基本元素 以下元素都可以用CSS变得更好看 q,<blockquote>,<em>,<br>, <strong>,ol ,ul,li,pre,cod ...

  4. 《JavaScript 闯关记》之 DOM(下)

    Element 类型 除了 Document 类型之外,Element 类型就要算是 Web 编程中最常用的类型了.Element 类型用于表现 XML 或 HTML 元素,提供了对元素标签名.子节点 ...

  5. sql 参数

    sqlserver :传参数是“@” oracle:是“:” mysql:是“?”

  6. javascript运动功能-分享到

    <script> //窗体载入,为div控件绑定事件 window.onload = function () { var div1 = document.getElementById('d ...

  7. 疯狂安卓Android自学笔记

    开发者必备自学工具: 谷歌搜索:www.yundou.info Android原版开发文档 (英文) Doc http://www.phoned.cn/docs/reference/android/v ...

  8. asp.net mvc 访问.html文件

    把html页面放在除Views文件夹外的任意文件夹,如Htmls--123.html,url直接访问便可,如 http://yourname/htmls/123.html 可以在路由表中排出不需要路由 ...

  9. Thread was being aborted.你遇到了吗?

    这个Exception目前了解到的有两个原因造成:        1.Reponse.Write的问题(目前网上找到的信息十有八九都讲的是这个问题)      2.Web.Config中设定的exec ...

  10. 哪几个数的阶乘末尾有n个零?

    题目:哪几个数的阶乘末尾有n个0?其中n是一个正整数,从键盘输入. int main( void ) /* name: zerotail.cpp */ { int num, n, c, m; cout ...