介绍
**定义:**享元模式顾名思义就是共享单元, 通过共享技术实现对相同或者相似对象的重用, 主要解决了空间节约的问题.
UML

示例
java
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);
}
}
java
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 Map<String, 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();
}
}
java
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());
}
}
java
package com.sumlv.demo.flyweight;
/**
* 白色棋子(共享享元类)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-18
*/
public class WhitePieces extends GoFlyweight {
@Override
public String getColor() {
return "White";
}
}
java
package com.sumlv.demo.flyweight;
/**
* 黑色棋子(共享享元类)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-18
*/
public class BlackPieces extends GoFlyweight {
@Override
public String getColor() {
return "Black";
}
}
总结
使用场景
-
当系统因为存在大量相同或相似对象而造成内存浪费时;
-
需要前瞻性的缓存一些经常使用的相同或相似对象时(如: java.lang.Integer.IntegerCache).
优点:
-
极大地减少了内存中相同或相似对象的数量, 节约系统资源, 提升系统性能;
-
享元对象的外部状态相对独立, 不会影响内部状态.
缺点:
- 为了便于对象共享, 享元对象需要将部分状态外部化, 区分内外部状态, 提高了复杂度.