设计模式之享元模式

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

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

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

  • 内部状态是存储在享元对象内部、可以共享的信息,并且不会随环境改变而改变。
  • 外部状态是随环境改变而改变并且不可以共享的状态。在需要使用的时候从外部传入享元对象内部。
  • 抽象享元,定义需要的操作。
  • 具体享元类,一般可以分为内部状态和外部状态。
  • 享元工厂,维护一个享元对象的池子,用到对象的时候取出来。

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

java 复制代码
public abstract class Flyweight {
    void put(Flyweight position) {
    }
    int getX() {
        return 0;
    }
    int getY() {
        return 0;
    }
}

public class ChessFlyweight extends Flyweight {
    private String color;
    public ChessFlyweight(String color) {
        this.color = color;
    }
    @Override
    public void put(Flyweight position) {
        if (!(position instanceof PositionFlyweight)) {
            System.out.println("位置错误。");;
        }
        System.out.println("在位置:" + "("+ position.getX() + "," + position.getY() +"), 放置了" + color + "棋子");
    }
}

public class PositionFlyweight extends Flyweight {
    private final int x;
    private final int y;
    public PositionFlyweight(int x, int y) {
        this.x = x;
        this.y = y;
    }
    @Override
    public int getX() {
        return x;
    }
    @Override
    public int getY() {
        return y;
    }
}

public class FlyweightFactory {
    private static final Flyweight WHITE = new ChessFlyweight("白色");
    private static final Flyweight BLACK = new ChessFlyweight("黑色");
    public static Flyweight getChess(String color) {
        if (color.equals("白色")) {
            return WHITE;
        } else if (color.equals("黑色")) {
            return BLACK;
        }
        return null;
    }
}

public class Demo {
    public static void main(String[] args) {
        Flyweight whiteChess1 = FlyweightFactory.getChess("黑色");
        Flyweight whiteChess2 = FlyweightFactory.getChess("黑色");
        Flyweight blackChess1 = FlyweightFactory.getChess("白色");
        Flyweight blackChess2 = FlyweightFactory.getChess("白色");
        whiteChess1.put(new PositionFlyweight(1, 1));
        blackChess1.put(new PositionFlyweight(2, 2));
        whiteChess2.put(new PositionFlyweight(3, 3));
        blackChess2.put(new PositionFlyweight(4, 4));
    }
}

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

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

相关推荐
梅头脑20 小时前
学了6种设计模式却写出了同事看不懂的代码——SOLID五原则反例对照,治好了我的"过度设计"
设计模式
workflower1 天前
案例:大模型驱动的“发现- 研判- 整改- 验证”全闭环治理体系
人工智能·深度学习·机器学习·设计模式·机器人
董员外1 天前
RAG 系统进化论(九):RAG 评测,怎样证明系统真的变好了?
人工智能·设计模式·程序员
西安小哥1 天前
AI时代技术工程师的"道法术器势":学习图谱、成长规划与角色重塑
人工智能·设计模式·程序员
莫得感情 o1 天前
设计模式 08 · 装饰器模式
设计模式·装饰器模式
董员外2 天前
RAG 系统进化论(八):Agentic RAG(智能体式 RAG),从回答问题到完成任务
人工智能·后端·设计模式
董员外2 天前
RAG 系统进化论(七):Multimodal RAG(多模态 RAG),当知识存在于表格、图片和页面中
人工智能·后端·设计模式
大山同学2 天前
第 2 篇(03-04 章):代理设计原则与工具使用设计模式
设计模式
啦啦啦啦啦zzzz3 天前
设计模式:桥接模式和组合模式
c++·设计模式·组合模式·桥接模式
莫得感情 o3 天前
设计模式 03 · 工厂方法模式
设计模式·工厂方法模式