2.7 享元模式(flyweight)
- 一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。
- 比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是 52 个,那么就要定义 52 个对象。如果有一个 1M 的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都共享一个对象,那么就大大节约了资源。
function Color(name) {
this.name = name
}
//使用对象池存放内部的状态对象,如果存在直接返回没有则创建
var colorFactory = {
colors: {},
create: function (name) {
var color = this.colors[name]
if (color) return color
this.colors[name] = new Color(name)
return this.colors[name]
}
}
module.exports = colorFactory
const expect = require('chai').expect
const colorFactory = require('../src/structural/flyweight/flyweight')
describe('享元模式 测试', () => {
it('重复颜色', () => {
colorFactory.create('RED')
colorFactory.create('RED')
colorFactory.create('RED')
colorFactory.create('YELLOW')
colorFactory.create('YELLOW')
expect(Object.keys(colorFactory.colors)).to.have.lengthOf(2)
})
})
es6 实现
class Color {
constructor(name) {
this.name = name
}
}
class colorFactory {
constructor(name) {
this.colors = {}
}
create(name) {
let color = this.colors[name]
if (color) return color
this.colors[name] = new Color(name)
return this.colors[name]
}
}
export { colorFactory }
const expect = require('chai').expect
import { colorFactory } from '../src/structural/flyweight/flyweight_es6'
describe('享元模式 es6测试', () => {
it('重复颜色', () => {
const cf = new colorFactory()
cf.create('RED')
cf.create('RED')
cf.create('YELLOW')
cf.create('YELLOW')
expect(Object.keys(cf.colors)).to.have.lengthOf(2)
})
})