javascript模式——Flyweight
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的更多相关文章
- 享元模式-Flyweight(Java实现)
享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...
- javascript 模式(1)——代码复用
程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ...
- 【读书笔记】读《JavaScript模式》 - 函数复用模式之现代继承模式
现代继承模式可表述为:其他任何不需要以类的方式考虑得模式. 现代继承方式#1 —— 原型继承之无类继承模式 function object(o) { function F() {}; F.protot ...
- 【读书笔记】读《JavaScript模式》 - 函数复用模式之类式继承模式
实现类式继承的目标是通过构造函数Child()获取来自于另外一个构造函数Parent()的属性,从而创建对象. 1.类式继承模式#1 —— 默认方式(原型指向父函数实例) function Paren ...
- 二十四种设计模式:享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...
- 初涉JavaScript模式系列 阶段总结及规划
总结 不知不觉写初涉JavaScript模式系列已经半个月了,没想到把一个个小点进行放大,竟然可以发现这么多东西. 期间生怕对JS的理解不到位而误导各位,读了很多书(个人感觉JS是最难的oo语言),也 ...
- 设计模式(十)享元模式Flyweight(结构型)
设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- 享元模式 FlyWeight 结构型 设计模式(十五)
享元模式(FlyWeight) “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...
随机推荐
- Java中String直接赋字符串和new String的区别
解析Java中的String对象的数据类型 1. String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ...
- windows-JDK环境变量设置
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_43;CLASS_PATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;p ...
- 线程:CyclicBarrier同步工具类
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点.比如公司组织活动出去玩,需要在公司门口一起搭车去.每个人从家里出发去公司门口,到达的时间肯定先后不一样,所以公司的车要一直等待,等所有人 ...
- CSS基础笔记
之前没有开通好博客,笔记都记录在有道云,今天全部转过来!!! 1.当同一个html元素不止一个样式定义时,内联样式(在html元素内部)拥有最高的优先权:其他如内部样式表(位于<head> ...
- js判断ie浏览器
function isIE() { //ie? if (!!window.ActiveXObject || "ActiveXObject" in window){ document ...
- JS中prototype属性-JS原型模式
/* *对象方法 *类方法 * 原型方法 */ function People(name) { this.name = name; this.say = function () { //对象方法 al ...
- 关于 knockout js 学习中的疑问 (1)
最近刚刚学习knockout中遇到如下问题: 1.在给viewModel定义一个方法时,有时后面跟 的this,有的时候没有 如下所示: this.fullName = ko.computed(fun ...
- VS2010程序打包操作(超详细的)
1. 在vs2010 选择“新建项目”----“其他项目类型”----“Visual Studio Installerà“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, ...
- C++文件
参考: C++文件读写详解(ofstream,ifstream,fstream):http://blog.csdn.net/kingstar158/article/details/6859379 fs ...
- python单元测试--深入理解unittest
单元测试的重要性就不多说了,可恶的是python中有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nos ...