当前位置:   article > 正文

设计模式之享元模式

设计模式之享元模式

概念:是池技术的重要实现方式,可以降低大量重复的、细粒度的类在内存中的开销。

享元模式是以共享的方式高效地支持大量的细粒度对象。

享元对象能做到共享的关键是区分内部状态和外部状态。

  • 内部状态是存储在享元对象内部、可以共享的信息,并且不会随环境改变而改变。
  • 外部状态是随环境改变而改变并且不可以共享的状态。在需要使用的时候从外部传入享元对象内部。

  • 抽象享元,定义需要的操作。
  • 具体享元类,一般可以分为内部状态和外部状态。
  • 享元工厂,维护一个享元对象的池子,用到对象的时候取出来。

用一个下围棋的例子来帮助大家理解。围棋只有黑棋和白棋,不必每次都创建新对象,这是内部状态。而棋子的落点可以作为外部状态传进来。

  1. public abstract class Flyweight {
  2. void put(Flyweight position) {
  3. }
  4. int getX() {
  5. return 0;
  6. }
  7. int getY() {
  8. return 0;
  9. }
  10. }
  11. public class ChessFlyweight extends Flyweight {
  12. private String color;
  13. public ChessFlyweight(String color) {
  14. this.color = color;
  15. }
  16. @Override
  17. public void put(Flyweight position) {
  18. if (!(position instanceof PositionFlyweight)) {
  19. System.out.println("位置错误。");;
  20. }
  21. System.out.println("在位置:" + "("+ position.getX() + "," + position.getY() +"), 放置了" + color + "棋子");
  22. }
  23. }
  24. public class PositionFlyweight extends Flyweight {
  25. private final int x;
  26. private final int y;
  27. public PositionFlyweight(int x, int y) {
  28. this.x = x;
  29. this.y = y;
  30. }
  31. @Override
  32. public int getX() {
  33. return x;
  34. }
  35. @Override
  36. public int getY() {
  37. return y;
  38. }
  39. }
  40. public class FlyweightFactory {
  41. private static final Flyweight WHITE = new ChessFlyweight("白色");
  42. private static final Flyweight BLACK = new ChessFlyweight("黑色");
  43. public static Flyweight getChess(String color) {
  44. if (color.equals("白色")) {
  45. return WHITE;
  46. } else if (color.equals("黑色")) {
  47. return BLACK;
  48. }
  49. return null;
  50. }
  51. }
  52. public class Demo {
  53. public static void main(String[] args) {
  54. Flyweight whiteChess1 = FlyweightFactory.getChess("黑色");
  55. Flyweight whiteChess2 = FlyweightFactory.getChess("黑色");
  56. Flyweight blackChess1 = FlyweightFactory.getChess("白色");
  57. Flyweight blackChess2 = FlyweightFactory.getChess("白色");
  58. whiteChess1.put(new PositionFlyweight(1, 1));
  59. blackChess1.put(new PositionFlyweight(2, 2));
  60. whiteChess2.put(new PositionFlyweight(3, 3));
  61. blackChess2.put(new PositionFlyweight(4, 4));
  62. }
  63. }

如果大家需要视频版本的讲解,欢迎关注我的B站。

十三、设计模式之享元模式讲解

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/395571
推荐阅读
相关标签
  

闽ICP备14008679号