• 【结构型】享元模式(Flyweight)


    享元模式(Flyweight)

    运用共享技术有效地支持大量细粒度的对象。(业务模型的对象进行细分得到科学合理的更多对象)

    适用场景

    • 一个应用程序使用了大量的对象。
    • 完全由于使用大量的对象,造成很大的存储开销。
    • 对象的大多数状态都可变为外部状态。
    • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
    • 应用程序不依赖于对象标识。由于 Flyweight 对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。
      在这里插入图片描述

    ✦ Flyweight 描述一个接口,通过这个接口 Flyweight 可以接受并作用于外部状态。
    ✦ ConcreteFlyweight 实现 Flyweight 接口,并为内部状态(如果有)增加存储空间。 ConcreteFlyweight 对象必须是可共享的。它所存储的状态必须是内部的,即它必须独立于 ConcreteFlyweight 对象的场景。
    ✦ 并非所有的 Flyweight 子类都需要被共享。Flyweight 接口使共享成为可能,但它并不强制共享。在 Flyweight 对象结构的某些层次,UnsharedConcreteFlyweight 对象通常将 ConcreteFlyweight 对象作为子结点。
    ✦ FlyweightFactory 创建并管理 Flyweight 对象;确保合理地共享 Flyweight ,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个己创建的实例或者在不存在时创建一个实例。
    ✦ Client 维持一个对 Flyweight 的引用;计算或存储一个或多个 Flyweight 的外部状态。

    享元模式实例代码(Java)

    import java.util.*;
    
    // Flyweight
    abstract class Shape {
        protected String color;
        public abstract void draw(int x, int y);
    }
    
    // ConcreteFlyweight
    class Circle extends Shape {
        public Circle(String color) {
            this.color = color;
        }
        @Override
        public void draw(int x, int y) {
            System.out.println("draw a color:" + color + " circle x:" + x + " y:" + y);
        }
    }
    
    // FlyweightFactory
    class ShapeFactory {
    	// FlyweightFactory创建并管理Flyweight对象;
    	// 确保合理地共享 Flyweight ,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个己创建的实例或者在不存在时创建一个实例。
        private Map<String, Shape> map = new HashMap<String, Shape>();
    
        public Shape getShape(String key) {
            if (!map.containsKey(key)) {
                map.put(key, new Circle(key));
                System.out.println("create color:" + key + " circle");
            }
            return map.get(key);
        }
    }
    
    public class FlyWeightMain {
        public static void main(String[] args) {
            ShapeFactory factory = new ShapeFactory();
    
            Random random = new Random();
            String[] colors = {"red", "blue", "green", "white", "black"};
    
            for (int i = 1; i <= 100; i++) {
                int x = random.nextInt(colors.length); // [0 ~ 4]
                Shape shape = factory.getShape(colors[x]);
    
                System.out.print("第" + i + "个圆:");
                shape.draw(random.nextInt(2022), random.nextInt(528));
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    其他设计模式详见本专栏其他博文~
    特别感谢zst_2001在备考软考期间提供的帮助,贴上博主B站
    zst_2001的个人空间

  • 相关阅读:
    群晖Cloud Sync数据同步到百度云、另一台群晖、nextcloud教程
    Nginx安装
    行业报告 | 智慧三角:长三角掀起AI产业热潮
    【牛客 - 剑指offer】JZ28 对称的二叉树 两种方案 Java实现
    linux操作系统shell脚本演示
    计算机视觉的应用16-基于pytorch框架搭建的注意力机制,在汽车品牌与型号分类识别的应用
    springboot+vue农产品销售配送网站
    SpringMVC【文件上传(原生方式上传、上传多文件、异步上传、跨服务器上传 ) 】(五)-全面详解(学习总结---从入门到深化)
    ifconfig与ip命令的比较
    一封来自hitwh的保研经历分享
  • 原文地址:https://blog.csdn.net/qq_44033208/article/details/128486991