结构型模式-享元模式

享元模式模式是什么

     享元模式(Flyweight Pattern)是一种对象池的设计模式,它旨在通过共享对象来减少内存使用和提高性能。

在享元模式中,对象被分为两种类型:内部状态(Intrinsic State)和外部状态(Extrinsic State)。

内部状态指对象可共享的信息,它们存储在享元对象内部并独立于具体场景,因此可以被多个对象共享使用。内部状态对于不同对象是相同的,不会随着对象的不同而变化。

外部状态指对象的特定场景下的信息,它们不能被共享,并且会随着对象的不同而变化。

享元模式的核心思想是尽量共享对象,减少重复创建对象的开销。通过将内部状态和外部状态分离,将内部状态作为共享对象的一部分,避免了重复创建相同的对象,从而达到节省内存的效果。

享元模式优缺点    

享元模式的优点:

  1. 减少内存的使用:享元模式通过共享对象来减少内存的使用。当多个对象需要相同的数据时,可以共享同一个对象,减少了重复创建对象的开销。

  2. 提高性能:由于共享对象可以被多个线程共享,可以减少线程间的竞争和同步开销,提高程序的性能。

  3. 简化系统设计:享元模式可以将系统中相似的对象抽象成共享对象,简化了系统的设计和实现。

享元模式的缺点:

  1. 复杂度增加:享元模式需要维护一个对象池来存储共享对象,增加了系统的复杂度。

  2. 对象共享可能带来安全问题:由于共享对象可以被多个线程同时访问,可能会导致线程安全问题,需要采取措施来保证共享对象的线程安全。

  3. 对象不可变性要求高:由于对象会被多个地方使用,如果对象的属性是可变的,可能会导致共享对象的状态不一致,需要保证共享对象的属性是不可变的。

享元模式应用场景

   

享元模式适用于以下场景:

  1. 当一个系统中存在大量相似对象,而这些对象可以共享一些公共状态,可以使用享元模式来节省内存,提高系统性能。
  2. 当需要生成大量的细粒度对象时,可以使用享元模式来减少对象的数量,减少内存消耗。
  3. 当对象的大部分状态可以外部化时,可以使用享元模式来共享这些外部状态,从而减少对象的内存占用。
  4. 当需要对对象进行复用,且对象的内部状态对外部环境是相对独立的时,可以使用享元模式来共享对象,提高系统性能。
  5. 当需要对对象进行区分,且对象的内部状态与外部环境无关时,可以使用享元模式来共享对象,减少对象数量。

代码示例  

享元模式是一种结构型设计模式,它旨在有效地共享细粒度对象的内存。

import java.util.HashMap;
import java.util.Map;

// 抽象享元类
interface Shape {
    void draw();
}

// 具体享元类
class Circle implements Shape {
    private String color;

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

    @Override
    public void draw() {
        System.out.println("Drawing circle with color: " + color);
    }
}

// 享元工厂类
class ShapeFactory {
    private static final Map<String, Shape> circleMap = new HashMap<>();

    public static Shape getCircle(String color) {
        Circle circle = (Circle) circleMap.get(color);

        if (circle == null) {
            circle = new Circle(color);
            circleMap.put(color, circle);
            System.out.println("Creating circle of color: " + color);
        }

        return circle;
    }
}

// 客户端代码
public class Main {
    private static final String colors[] = { "Red", "Green", "Blue" };

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());
            circle.draw();
        }
    }

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

在上面的示例中,Shape接口定义了draw()方法,表示绘制图形的操作。Circle类是具体享元类,它包含一个颜色属性,并实现了draw()方法。

ShapeFactory是享元工厂类,它维护一个circleMap,存储已经创建过的圆形对象。在getCircle()方法中,首先尝试从circleMap中获取指定颜色的圆形对象,如果不存在,则创建新的圆形对象并加入到circleMap中。

在客户端代码中,我们可以通过ShapeFactory获取圆形对象,并调用其draw()方法进行绘制。由于享元模式共享对象的内存,所以在这个示例中,我们创建了20个圆形对象,但实际上只创建了3个不同颜色的圆形对象(Red、Green和Blue)。

总结

    

享元模式是一种结构型设计模式,可以在处理大量细粒度对象时减少内存消耗。

在享元模式中,共享对象被创建并共享,以减少重复创建相似对象的开销。这些共享对象称为享元对象。每个享元对象都具有内部状态和外部状态。

内部状态是在享元对象创建时确定的,并且可以被共享。外部状态是在享元对象被使用时传递给享元对象的,并且不可以被共享。

享元模式的核心思想是将对象的状态分为共享状态和非共享状态,并将共享状态抽取出来,作为共享对象的内部状态。非共享状态则作为外部状态,由客户端在使用时传递给享元对象。

享元模式的优点包括减少内存消耗、提高性能、提供对象的复用性。缺点是增加了代码复杂度,需要维护内部和外部状态的协调。

使用享元模式时,需要注意内部状态和外部状态的划分,确保内部状态可以被共享,并且外部状态不会影响共享对象的行为。

在实际应用中,享元模式可以用于缓存、线程池、数据库连接池等场景,可以显著提高系统的性能和资源利用率。

相关推荐

  1. 结构模式-模式

    2024-06-17 08:54:03       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 08:54:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 08:54:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 08:54:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 08:54:03       18 阅读

热门阅读

  1. CMake Tutorial (3.30-rc3版) 练习和点评

    2024-06-17 08:54:03       8 阅读
  2. HTML中的<br>、<hr>和<pre>标签使用指南

    2024-06-17 08:54:03       8 阅读
  3. 重庆思庄技术分享——启动Oracle下最小追踪日志

    2024-06-17 08:54:03       7 阅读
  4. vue实现图片预览

    2024-06-17 08:54:03       6 阅读
  5. 「C系列」C 文件读写

    2024-06-17 08:54:03       7 阅读
  6. 后端开发面试题4(附答案)

    2024-06-17 08:54:03       7 阅读
  7. C++ 二分查找法【面试】

    2024-06-17 08:54:03       7 阅读
  8. 1、C++编程中的基本运算 - 课件

    2024-06-17 08:54:03       7 阅读
  9. SpringSecurity(JWT、SecurityConfig、Redis)

    2024-06-17 08:54:03       6 阅读
  10. API 类别 - 特效核心

    2024-06-17 08:54:03       5 阅读
  11. Linux 基础IO 三

    2024-06-17 08:54:03       6 阅读
  12. 你应该知道的口语连读技巧

    2024-06-17 08:54:03       6 阅读
  13. Rust创建基准测试bench

    2024-06-17 08:54:03       6 阅读
  14. AWS无服务器 应用程序开发—第十三章 小结2

    2024-06-17 08:54:03       5 阅读
  15. 迁移学习和从头训练(from scratch)的区别

    2024-06-17 08:54:03       6 阅读
  16. Conda编译

    2024-06-17 08:54:03       8 阅读