享元模式(structural 6)

205 阅读1分钟

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)
	})
})