享元模式(Flyweight Pattern)

利用Map或其它方式减少重复创建相同类型的实例对象。

享元模式的实例

现在有一个圆,但是我们需要不同颜色的圆来使用。

  1. class Circle {
  2. constructor(color){
  3. this.color = color;
  4. }
  5. setX(x) {
  6. this.x = x;
  7. }
  8. setY(y) {
  9. this.y = y;
  10. }
  11. setRadius(radius) {
  12. this.radius = radius;
  13. }
  14. draw() {
  15. console.log("Circle: Draw() [Color : " + this.color
  16. +", x : " + this.x +", y :" + this.y +", radius :" + this.radius);
  17. }
  18. }

那么我们可以使用一个形状工厂,在生产的时候使用Map将相同的颜色缓存起来,需要再用的时候还可以再使用。

  1. class ShapeFactory {
  2. static getCircle(color) {
  3. let circle = ShapeFactory.circleMap.get(color);
  4. if(circle == null) {
  5. circle = new Circle(color);
  6. ShapeFactory.circleMap.set(color, circle);
  7. console.log("Creating circle of color : " + color);
  8. }
  9. return circle;
  10. }
  11. }
  12. ShapeFactory.circleMap = new Map();

那么即使用创建很多不同种类的圆,但是真正创建的实例只有圆种类的数量。

  1. const colors =["Red", "Green", "Blue", "White", "Black" ];
  2. for(let i=0; i < 20; ++i) {
  3. const circle = ShapeFactory.getCircle(
  4. colors[Math.floor(Math.random()*colors.length)]
  5. );
  6. circle.setX(Math.floor(Math.random()*100));
  7. circle.setY(Math.floor(Math.random()*100));
  8. circle.setRadius(100);
  9. circle.draw();
  10. }
  11. /**
  12. * output:
  13. * Creating circle of color : Red
  14. * Circle: Draw() [Color : Red, x : 44, y :20, radius :100
  15. * Creating circle of color : Green
  16. * Circle: Draw() [Color : Green, x : 84, y :4, radius :100
  17. * Circle: Draw() [Color : Green, x : 98, y :64, radius :100
  18. * Creating circle of color : Blue
  19. * Circle: Draw() [Color : Blue, x : 97, y :31, radius :100
  20. * Circle: Draw() [Color : Red, x : 37, y :5, radius :100
  21. * Creating circle of color : Black
  22. * Circle: Draw() [Color : Black, x : 5, y :51, radius :100
  23. * Circle: Draw() [Color : Black, x : 49, y :36, radius :100
  24. * Circle: Draw() [Color : Blue, x : 27, y :69, radius :100
  25. * Circle: Draw() [Color : Red, x : 82, y :99, radius :100
  26. * Circle: Draw() [Color : Blue, x : 79, y :1, radius :100
  27. * Creating circle of color : White
  28. * Circle: Draw() [Color : White, x : 19, y :23, radius :100
  29. * Circle: Draw() [Color : White, x : 27, y :36, radius :100
  30. * Circle: Draw() [Color : Blue, x : 71, y :90, radius :100
  31. * Circle: Draw() [Color : Green, x : 80, y :66, radius :100
  32. * Circle: Draw() [Color : Black, x : 94, y :49, radius :100
  33. * Circle: Draw() [Color : Red, x : 49, y :90, radius :100
  34. * Circle: Draw() [Color : Black, x : 33, y :86, radius :100
  35. * Circle: Draw() [Color : Blue, x : 52, y :97, radius :100
  36. * Circle: Draw() [Color : White, x : 0, y :42, radius :100
  37. * Circle: Draw() [Color : Blue, x : 29, y :42, radius :100
  38. */

享元模式的优势

在需要大量重复相同实例的时候,可以使用这种方式来降低极大的内存开销。

上一页(外观模式)

下一页(代理模式)