什么是享元模式吗?享元模式和单例模式的区别你如何理解?

1 个回答

  • 小王子-B491
    看山,看水,看众生,也看自己。
    #### 享元模式(Flyweight Pattern) **定义**:享元模式的主要目的是通过共享细粒度对象来节省内存开销。享元模式在系统中只保留一份相同对象的实例,供多个对象共享,避免重复创建相同对象,节省内存。 **特点**: 1. **共享对象**:享元模式通过共享对象来减少内存使用,确保相同对象只存在一份。 2. **不可变对象**:享元对象通常是不可变的,以保证在多个场景中共享对象的安全性。 3. **节省内存**:通过共享对象,减少内存中重复对象的数量。 **使用场景**: - 系统中存在大量相同或相似的对象,这些对象会耗费大量内存。 - 对象是不可变的,可以安全地在多个场景中共享。 **典型例子**: Java 中的 `Integer` 缓存就是享元模式的一个典型实现。Java 对 -128 到 127 范围内的整数进行了缓存,避免了重复创建相同的 Integer 对象。 #### 示例代码 ```java import java.util.HashMap; import java.util.Map; class IntegerFactory { private static final Map<Integer, Integer> cache = new HashMap<>(); public static Integer valueOf(int i) { if (i >= -128 && i <= 127) { // 缓存范围 Integer cached = cache.get(i); if (cached == null) { cached = new Integer(i); cache.put(i, cached); } return cached; } return new Integer(i); } } public class FlyweightPatternDemo { public static void main(String[] args) { Integer a = IntegerFactory.valueOf(127); Integer b = IntegerFactory.valueOf(127); System.out.println(a == b); // 输出 true Integer c = IntegerFactory.valueOf(128); Integer d = IntegerFactory.valueOf(128); System.out.println(c == d); // 输出 false } } ``` #### 单例模式(Singleton Pattern) **定义**:单例模式的目的是确保一个类只有一个实例,并提供一个全局访问点。 **特点**: 1. **单一实例**:单例模式确保一个类只有一个实例。 2. **全局访问点**:单例模式提供一个全局的访问点,通过该访问点可以访问唯一的实例。 **使用场景**: - 系统中某个类的实例需要全局唯一。 - 需要提供一个全局访问点访问实例。 **典型例子**: Java 中的 `Runtime` 类就是一个典型的单例模式实现。 #### 示例代码 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } public class SingletonPatternDemo { public static void main(String[] args) { Singleton singleton1 = Singleton.getInstance(); Singleton singleton2 = Singleton.getInstance(); System.out.println(singleton1 == singleton2); // 输出 true } } ``` ### 享元模式与单例模式的区别 1. **目的不同**: - **享元模式**:通过共享对象来节省内存。 - **单例模式**:确保一个类只有一个实例,提供全局访问点。 2. **实现方式不同**: - **享元模式**:在对象池中存储可共享的对象,并通过工厂方法来管理这些对象。 - **单例模式**:通过静态变量和方法来确保类的唯一实例。 3. **应用场景不同**: - **享元模式**:适用于系统中有大量相同或相似的对象,这些对象可以被共享使用。 - **单例模式**:适用于需要全局唯一实例的场景,例如配置管理器、日志记录器等。 4. **对象数量不同**: - **享元模式**:享元模式中可能存在多个对象,这些对象是共享的。 - **单例模式**:单例模式确保全局只有一个实例。 总结起来,享元模式和单例模式虽然有时会有相似之处,但它们的设计目的和应用场景是不同的。在使用时,需要根据具体问题和需求来选择合适的模式。
    发布于 2024-08-08 08:09 •IP属地 山西
    举报
    评论
    收藏