学习设计模式之享元模式

享元模式
运用共享技术有效的支持大量细粒度的对象。

类结构图
在这里插入图片描述
FlyweightFactory
一个享元类,用来创建并管理 Flyweight 对象。它主要是用来确保合理地共享 Flyweight,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个已创建的实例。
Flyweight
所有具体享元类的超类或接口,通过这个接口,Flyweight 可以接受并作用于外部状态。
ConcreteFlyweight
实现了 Flyweight 超类或接口,并为内部状态增加存储空间。
UnsharedConcreteFlyweight
指那些不需要的共享的 Flyweight 子类。因为 Flyweight 接口共享成为可能,但它并不能强制共享。

代码示例

public interface Flyweight {
    void operation(int extrinsicState);
}

public class ConcreteFlyweight implements Flyweight {
    @Override
    public void operation(int extrinsicState) {
        System.out.println("具体的 Flyweight: " + extrinsicState);
    }
}

public class UnsharedConcreteFlyweight implements Flyweight {
    @Override
    public void operation(int extrinsicState) {
        System.out.println("不共享的具体 Flyweight: " + extrinsicState);
    }
}

public class FlyweightFactory {
    private Map<String, Flyweight> flyweightMap = new HashMap<>();

    public FlyweightFactory() {
        this.flyweightMap.put("X", new ConcreteFlyweight());
        this.flyweightMap.put("Y", new ConcreteFlyweight());
        this.flyweightMap.put("Z", new ConcreteFlyweight());
    }

    public Flyweight getFlyweight(String key) {
        return this.flyweightMap.get(key);
    }
}

客户端示例

public class FlyweightClient {
    public static void main(String[] args) {
        int extrinsicState = 22;
        FlyweightFactory factory = new FlyweightFactory();

        Flyweight fx = factory.getFlyweight("X");
        fx.operation(--extrinsicState);
        Flyweight fy = factory.getFlyweight("Y");
        fy.operation(--extrinsicState);
        Flyweight fz = factory.getFlyweight("Z");
        fz.operation(--extrinsicState);

        UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();
        uf.operation(--extrinsicState);
    }
}

运行结果

具体的 Flyweight: 21
具体的 Flyweight: 20
具体的 Flyweight: 19
不共享的具体 Flyweight: 18

Process finished with exit code 0

内部状态与外部状态
在享元对象内部并且不会随着环境改变而改变的共享部分,可以成为享元对象的内部状态,而随着环境改变而改变的、不可以共享的状态就是外部状态。

使用场景
如果一个应用程序使用了大量的对象,而大量使的这些对象造成了很大的存储开销时就应该考虑使用;

优点
有效的降低系统中对象的实例数量,省资源。

缺点
使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。

posted @   一定要细心  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战
点击右上角即可分享
微信分享提示