享元模式
提出问题 当要创建大量相似对象时,需要消耗大量的系统资源。还记不记得我们之前讲到过,想要创建大量的相似对象,可以用原型模式。复制对象所用的资源要少于new新的对象。但是,存储对象所占用的内存空间是不会少的。如果我们想要节省内存空间应该怎么做?这就是我们今天要讲的享元模式
解决问题 想要节省存储空间,那就要少创建对象。但是我们终归还是要用到那么多对象的,该怎么办呢?我们可以只创建一个对象,然后到处都使用这一个对象。这听起来是不是有点像单例模式?我觉得他就是单例模式。只不过,享元模式是每个不同属性的对象只有一个。另外,享元模式还解决了一个问题:
尽管对象很相似,但是还是有不同点。同一个对象是完全相同的,该怎么表现这些不同点呢?我们可以把这些不同点当成另外一个独立的对象。
比如说我们有一个下围棋的应用。棋盘上所有的黑棋都是一模一样的,只是位置不一样。我们可以用一个棋子对象来表示所有的棋,而位置信息则存放在若干个位置对象中。
直接上代码:
class Position { constructor (x, y) { this .x = x; this .y = y; } getPos() { console .log(this .x, this .y); } } class Chess { constructor (color) { this .color = color; } display(position) { console .log("显示棋子:" , this .color); position.getPos(); } } class Factory { constructor () { this .pool = {}; } getInstance(type) { return this .pool[type] || new Chess(type); } } let factory = new Factory();let black1 = factory.getInstance("black" );let black2 = factory.getInstance("black" );let black3 = factory.getInstance("black" );let white1 = factory.getInstance("white" );let white2 = factory.getInstance("white" );let white3 = factory.getInstance("white" );black1.display(new Position(1 ,1 )); black2.display(new Position(2 ,1 )); black3.display(new Position(3 ,1 )); white1.display(new Position(4 ,1 )); white2.display(new Position(5 ,1 )); white3.display(new Position(6 ,1 ));