享元模式

介绍

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

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. 为了便于对象共享, 享元对象需要将部分状态外部化, 区分内外部状态, 提高了复杂度.
相关推荐
ximu_polaris6 天前
设计模式(C++)-结构型模式-享元模式
c++·设计模式·享元模式
geovindu6 天前
go: Flyweight Pattern
开发语言·设计模式·golang·享元模式
workflower8 天前
机器人应用-楼宇室内巡逻
大数据·人工智能·算法·microsoft·机器人·动态规划·享元模式
Rsun0455113 天前
12、Java 享元模式从入门到实战
java·开发语言·享元模式
yaaakaaang19 天前
十一、享元模式
java·享元模式
无籽西瓜a22 天前
【西瓜带你学设计模式 | 第十四期 - 享元模式】享元模式 —— 内外状态分离与对象共享实现、优缺点与适用场景
java·设计模式·软件工程·享元模式
砍光二叉树1 个月前
【设计模式】结构型-享元模式
设计模式·享元模式
Chasing__Dreams1 个月前
python--设计模式--13.1--结构性--享元模式
python·设计模式·享元模式
sg_knight2 个月前
设计模式实战:享元模式(Flyweight)
python·设计模式·享元模式·flyweight