当前位置: 首页 > news >正文

设计模式-结构型模式-享元模式

概述

享元模式Flyweight Pattern : 是一种结构型设计模式,也叫做 蝇量模式
主要通过对象的复用来减少对象创建的次数和数量,从而减少系统内存的使用和降低系统的负载。

主要作用
避免在有大量对象时频繁创建和销毁造成系统资源的浪费,把对象中共同的部分抽象出来,如果有相同的业务请求,则直接返回内存中已有的对象,避免重新创建对象。
即 : 在系统需要一个对象时,首先在系统中查找并尝试重用已有的对象,如果未找到匹配的对象,则创建新对象并将其缓存在系统中以便下次使用。

既然要从内存中匹配对象,因此,需要有一个类来充当对象池的角色,对象的获取,经过这个对象池。

核心概念

内部状态(Intrinsic State)
可以共享的状态,存储在对象内部,对所有调用者可见。
例如 : 围棋的棋子 , 只有 黑、白 两种颜色,这个就可以划分为 棋子的内部状态。

外部状态(Extrinsic State)
随外部环境变化的状态,不存储在对象内部,而是由客户端在调用时传递。
例如 : 围棋棋子的位置坐标,每一颗棋子在下棋过程中才能确定,即为外部状态。

核心角色

抽象享元(Flyweight):定义享元对象的接口,声明内部状态和操作。
具体享元(Concrete Flyweight):实现抽象享元接口,存储内部状态。
享元工厂(Flyweight Factory):负责创建和管理享元对象,维护对象池(共享对象的缓存)。

类图

在这里插入图片描述

案例代码

享元接口

public interface CheesePiece {
    // 外部状态 : 坐标位置 : 下棋的时候才能确定
    void display(int x,int y);
}

实现类

public class ConcreteCheesePiece implements CheesePiece{

    // 内部状态 : 棋子的颜色
    private String color;
    
	// 构造方法、getter、setter 方法
   
    @Override
    public void display(int x, int y) {
        System.out.println(color + " 落在了 ("+x+","+y+") 的位置");
    }
}

享元工厂

public class CheesePieceFactory {

    // 一个存储享元对象的容器
    private static Map<String, CheesePiece> pool = new HashMap<>();

    // 获取享元对象
    public static CheesePiece getCheesePiece(String color) {

        // 如果容器中没有这个对象,就创建一个,并放入容器中
        if (!pool.containsKey(color)){
            pool.put(color, new ConcreteCheesePiece(color));
        }
        // 返回享元对象
        return pool.get(color);
    }

}

客户端

public class Client {
    public static void main(String[] args)
    {
        CheesePiece black = CheesePieceFactory.getCheesePiece("黑子");
        CheesePiece white = CheesePieceFactory.getCheesePiece("白子");

        black.display(1, 1);
        white.display(2, 2);

        // 验证一下,重复获取对象是否为同一个对象
        CheesePiece black2 = CheesePieceFactory.getCheesePiece("黑子");
        System.out.println(black == black2);

    }
}
运行结果:
黑子 落在了 (1,1) 的位置
白子 落在了 (2,2) 的位置
true

相关文章:

  • JVM类加载器详解
  • C++轻量HeaderOnly的JSON库
  • 10组时尚复古美学自然冷色调肖像电影照片调色Lightroom预设 De La Mer – Nautical Lightroom Presets
  • 32.代码题
  • 常用的排序算法------练习4
  • 蓝桥杯专项复习——前缀和
  • allegro skill
  • 中国固定资产投资统计年鉴(1950-2023年)
  • 创建和管理Pod
  • 深入解析最大公约数(GCD)与最小公倍数(LCM)的C++实现
  • 06_约束
  • Java的IO模型、Netty原理详解
  • IDEA中打开项目Vue+Vue基本语法
  • 内网穿透_ZeroTiers部署_广和通SC171_aidlux_嵌入式
  • 在机器人和无人机时代,测绘人的出路在哪里?
  • 【C++初阶】--- 内存管理
  • Java进阶——位运算
  • 系统间交互时,怎么校验两个系统所在服务器时间是否一致
  • 【android bluetooth 协议分析 06】【l2cap详解 5】【通俗易懂l2cap 定时器rtx和ertx】
  • Go中的逃逸分析
  • 找外包公司做网站价钱/杭州谷歌推广
  • vps网站被镜像/十大舆情网站
  • 途牛网站建设/优化的概念
  • 做网站能挣钱么/一站式营销平台
  • 网站建设与网页设计大作业/b2b网站大全免费推广
  • 做淘宝还是做网站容易/网站整合营销推广