享元模式

张开发
2026/5/11 10:23:33 15 分钟阅读

分享文章

享元模式
介绍定义:享元模式顾名思义就是共享单元, 通过共享技术实现对相同或者相似对象的重用, 主要解决了空间节约的问题.UML示例package com.sumlv.demo; import com.sumlv.demo.flyweight.GoFactory; import com.sumlv.demo.flyweight.GoFlyweight; public class Main { /** * 细心的同学已经发现示例代码和UML对不上的问题了 * 设计模式从来都没有固定的写法和结构, 设计思路不跑偏, 能解决实际问题即可 * 享元模式的核心是解决对象复用的问题 */ public static void main(String[] args) { GoFactory factory GoFactory.getInstance(); GoFlyweight whitePieces1 factory.getPieces(w); GoFlyweight whitePieces2 factory.getPieces(w); System.out.println(whitePieces1 whitePieces2); GoFlyweight blackPieces1 factory.getPieces(b); GoFlyweight blackPieces2 factory.getPieces(b); System.out.println(blackPieces1 blackPieces2); } }package com.sumlv.demo.flyweight; import java.util.HashMap; import java.util.Map; /** * 围棋工厂(享元工厂类) * * Auther: yuzhuo.song * Date: 2026-03-18 */ public class GoFactory { private static MapString, GoFlyweight flyweightPoll; private GoFactory() { flyweightPoll new HashMap(); flyweightPoll.put(w, new WhitePieces()); flyweightPoll.put(b, new BlackPieces()); } public static GoFactory getInstance() { return SingletonHolder.INSTANCE; } public GoFlyweight getPieces(String key) { return flyweightPoll.get(key); } private static class SingletonHolder { private static final GoFactory INSTANCE new GoFactory(); } }package com.sumlv.demo.flyweight; /** * 围棋(抽象享元类) * * Auther: yuzhuo.song * Date: 2026-03-18 */ public abstract class GoFlyweight { public abstract String getColor(); public void display() { System.out.println(棋子颜色: this.getColor()); } }package com.sumlv.demo.flyweight; /** * 白色棋子(共享享元类) * * Auther: yuzhuo.song * Date: 2026-03-18 */ public class WhitePieces extends GoFlyweight { Override public String getColor() { return White; } }package com.sumlv.demo.flyweight; /** * 黑色棋子(共享享元类) * * Auther: yuzhuo.song * Date: 2026-03-18 */ public class BlackPieces extends GoFlyweight { Override public String getColor() { return Black; } }总结使用场景1. 当系统因为存在大量相同或相似对象而造成内存浪费时;2. 需要前瞻性的缓存一些经常使用的相同或相似对象时(如: java.lang.Integer.IntegerCache).优点1. 极大地减少了内存中相同或相似对象的数量, 节约系统资源, 提升系统性能;2. 享元对象的外部状态相对独立, 不会影响内部状态.缺点1. 为了便于对象共享, 享元对象需要将部分状态外部化, 区分内外部状态, 提高了复杂度.

更多文章