首页 > 编程语言 >java设计模式(十二)享元模式(Flyweight Pattern)

java设计模式(十二)享元模式(Flyweight Pattern)

时间:2024-07-04 09:01:53浏览次数:18  
标签:享元 java color private FlyweightClass static 设计模式 public

1、模式介绍:

        享元模式是一种结构型设计模式,旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态(可共享)和外部状态(不可共享)来减少内存消耗和提高性能。内部状态存储在享元对象内部,而外部状态则由客户端代码管理和传递。

2、应用场景:

        对象池:当程序中存在大量相似对象且不需要区分其具体身份时,可以使用享元模式。比如线程池、连接池等。
        文本编辑器:对于每一个字符或者格式化文本片段,如果存在大量相同的文本片段,可以共享相同的内部状态,减少内存消耗。
        游戏开发:在游戏中,大量的角色或者粒子对象可能具有相同的外观和行为,可以通过享元模式来节省资源。
        字符串常量池:Java中的字符串常量池就是享元模式的一个实际应用,相同的字符串常量在内存中只存储一份,多个字符串变量可以共享同一个常量。

3、优点:

        减少内存消耗:通过共享相同的对象实例,减少内存使用。
        提高性能:减少了创建对象的时间,特别是在对象频繁被创建和销毁的场景下。

4、缺点:

        可能引入额外的复杂性:需要对内部状态和外部状态进行区分和管理,可能增加系统的复杂度。
        需要合理划分内部状态和外部状态:不正确的划分可能导致系统的逻辑混乱。

5、代码实现:

/**
 * 享元接口
 *
 * @author FM_南风
 * @date 2024/6/27
 */
public interface FlyweightInterface {
    //绘画方法
    void draw();
}

/**
 * 享元实现类
 *
 * @author FM_南风
 * @date 2024/6/27
 */
@Data
public class FlyweightClass implements FlyweightInterface{
     private final String color; // 颜色
     private int x, y, radius; // 坐标半径

     public FlyweightClass(String color) {
      this.color = color;
     }

     @Override
     public void draw() {
      System.out.println("享元实现类: 绘画 [Color : " + color
              + ", x : " + x + ", y :" + y + ", radius :" + radius);
     }
}

/**
 * 享元工厂
 *
 * @author FM_南风
 * @date 2024/6/27
 */
public class FlyweightFactory {

    private static final Map<String, FlyweightInterface> flyweightMap = new HashMap<>();

    public static FlyweightInterface getCircle(String color) {
        FlyweightClass flyweightClass = (FlyweightClass) flyweightMap.get(color);

        if (flyweightClass == null) {
            flyweightClass = new FlyweightClass(color);
            flyweightMap.put(color, flyweightClass);
            System.out.println("开始创作: " + color);
        }
        return flyweightClass;
    }
}

/**
 * 应用
 *
 * @author FM_南风
 * @date 2024/6/27
 */
public class FlyweightClient {
 private static final String[] colors = {"红", "绿", "蓝"};

 public static void main(String[] args) {
  for (int i = 0; i < 20; ++i) {
   FlyweightClass circle = (FlyweightClass) FlyweightFactory.getCircle(getRandomColor());
   circle.setX(getRandomX());
   circle.setY(getRandomY());
   circle.setRadius(100);
   circle.draw();
  }
 }

 private static String getRandomColor() {
  return colors[(int) (Math.random() * colors.length)];
 }

 private static int getRandomX() {
  return (int) (Math.random() * 100);
 }
 
 private static int getRandomY() {
  return (int) (Math.random() * 100);
 }
}

6、结果展示:

7、代码示例说明:

在这个示例中:FlyweightClass类作为具体享元类,颜色(内部状态)color 是享元的一部分,而 x、y、raidus则是外部状态。
FlyweightFactory 类作为享元工厂,负责管理和提供享元对象。享元对象在首次创建时存储在 flyweightMap 中,以便于后续共享使用。
FlyweightClient类作为客户端代码,演示如何使用享元模式来创建和绘制多个圆形对象,共享相同的颜色。
通过享元模式,可以看到多个具有相同颜色的圆形对象共享同一个 FlyweightClass 实例,从而减少了对象的创建和内存消耗。

标签:享元,java,color,private,FlyweightClass,static,设计模式,public
From: https://blog.csdn.net/weixin_70044963/article/details/140024722

相关文章

  • 2024年华为OD机试真题- 分月饼-(C++/Java/python)-OD统一考试(C卷D卷)
      2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】   题目描述中秋节,公司分月饼,m个员工,买了n个月饼,m≤n,每个员工至少分1个月饼,但可以分多个,单人分到最多月饼的个数是Max1,单人分到第二多月饼个数是Max2,Max1-Max2≤3,单人分到第n-1多月饼个......
  • 聊聊JAVA项目中架构以及配置文件
        今天我来聊一下以前项目中的架构和配置文件,之前发的一篇关于用原始的TOMCAT进行项目打包和启动的文章很多人都看了。也得到了不少点赞和评论,这也是算大家对我的认可。    今天呢,我们继续来聊聊以前Java项目当中的项目架构和配置文件。    首先是......
  • HarmonyOS Next开发学习手册——共享元素转场
    共享元素转场是一种界面切换时对相同或者相似的两个元素做的一种位置和大小匹配的过渡动画效果,也称一镜到底动效。如下例所示,在点击图片后,该图片消失,同时在另一个位置出现新的图片,二者之间内容相同,可以对它们添加一镜到底动效。左图为不添加一镜到底动效的效果,右图为添加一......
  • Minecraft Java 1.20.1 forge服务器搭建
    ☁️MinecraftJava1.20.1forge服务器搭建......
  • java使用sshd 实现sftp 自定义显示目录
       pom.xml<dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.8.28</version></dependency>......
  • 木舟0基础学习Java的第九天
    面向对象OOPfinal(最终的):用final修饰的所以变量名必须大写修饰类:类不能被继承修饰变量:变量就变成了常量只能被赋值一次修饰方法:方法不能被重写多态(polymorphic)多态的前提:         1.有继承关系         2.有方法重写//在多态中编......
  • 基于java的厨房达人美食分享平台
    作者介绍:✌全网粉丝10W+本平台特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于毕业项目实战✌一、作品包含源码+数据库+设计文档万字LW+PPT+全套环境和工具资源+部署教程二、项目技术前端......
  • 基于java的大学生在线论坛
    作者介绍:✌全网粉丝10W+本平台特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于毕业项目实战✌一、作品包含源码+数据库+设计文档万字LW+PPT+全套环境和工具资源+部署教程二、项目技术前端......
  • MRCTF 2022 EzJava
    MRCTF2022EzJava题目分析下载附件得到一个jar包和一个waf配置文件。如果只是为了本地搭建环境,直接启动jar包就行了,但是如果需要进行远程调试就需要进行一些配置(这个网上教程很多),这个调试也要看具体需求,能直接打通的话就不需要调试。但是不管怎么说,第一步肯定都是先解压......
  • 基于java的厨房达人美食分享平台
    作者介绍:✌全网粉丝10W+本平台特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于毕业项目实战✌一、作品包含源码+数据库+设计文档万字LW+PPT+全套环境和工具资源+部署教程二、项目技术前端......