享元模式

介绍

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

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";
    }

}

总结

使用场景

  1. 当系统因为存在大量相同或相似对象而造成内存浪费时;

  2. 需要前瞻性的缓存一些经常使用的相同或相似对象时(如: java.lang.Integer.IntegerCache).

优点:

  1. 极大地减少了内存中相同或相似对象的数量, 节约系统资源, 提升系统性能;

  2. 享元对象的外部状态相对独立, 不会影响内部状态.

缺点:

  1. 为了便于对象共享, 享元对象需要将部分状态外部化, 区分内外部状态, 提高了复杂度.
相关推荐
Chasing__Dreams1 天前
python--设计模式--13.1--结构性--享元模式
python·设计模式·享元模式
sg_knight5 天前
设计模式实战:享元模式(Flyweight)
python·设计模式·享元模式·flyweight
C++chaofan5 天前
JUC 并发编程:不可变对象、享元模式与自定义连接池 学习笔记
java·享元模式·并发编程·连接池·juc·不可变对象
资深web全栈开发1 个月前
设计模式之享元模式 (Flyweight Pattern)
设计模式·享元模式
YigAin1 个月前
Unity23种设计模式之 享元模式
设计模式·享元模式
会员果汁2 个月前
22.设计模式-享元模式(Flyweight)
设计模式·哈希算法·享元模式
懵萌长颈鹿2 个月前
享元模式 (Flyweight Pattern)
享元模式
apolloyhl2 个月前
FlyWeight 享元模式
享元模式
小码过河.2 个月前
设计模式——享元模式
java·设计模式·享元模式