享元模式模式简介

概念

享元模式(Flyweight pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用和提高性能。它通过将对象的状态分为可共享的内部状态和不可共享的外部状态,来实现对象的共享。内部状态可以被多个对象共享,而外部状态则取决于具体的对象。通过共享内部状态,可以减少系统中相似对象的数量,从而节省内存空间。

特点

  1. 减少内存占用:通过共享内部状态,减少了相似对象的数量,降低了内存占用。
  2. 提高性能:减少了创建相似对象的开销,提高了系统的性能。
  3. 分离内部状态和外部状态:内部状态可以共享,外部状态是独立的,客户端可以自行设置。

优点

  1. 减少内存占用:通过共享内部状态,减少了相似对象的数量,降低了内存占用。
  2. 提高性能:减少了创建相似对象的开销,提高了系统的性能。
  3. 简化对象结构:通过将状态分离,简化了对象的结构,使得对象更加轻量级。

缺点

  1. 对象共享可能导致线程安全问题:如果多个线程同时访问共享对象,并修改了外部状态,可能会导致线程安全问题。
  2. 增加了代码复杂性:为了实现对象的共享和分离状态,需要引入额外的逻辑,增加了代码的复杂性。

适用场景

  1. 对象数量庞大且相似:当系统中存在大量相似的对象,并且这些对象的区别仅在于它们的内部状态时,可以考虑使用享元模式。
  2. 需要缓存对象的应用:当需要缓存对象以提高性能时,可以使用享元模式来共享对象。

实现方式

  1. 内部状态和外部状态分离:将对象的状态分为内部状态和外部状态,内部状态可以共享,外部状态是独立的。
  2. 对象池:通过维护一个对象池来管理可共享的对象,客户端从对象池中获取对象,并设置外部状态。
  3. 使用工厂模式:可以结合工厂模式来创建享元对象,工厂负责管理对象的共享和创建。

实现代码:

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

// 抽象享元接口
interface Flyweight {
    void operation(String extrinsicState);
}
// 具体享元类
class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    public void operation(String extrinsicState) {
        System.out.println("Intrinsic State: " + intrinsicState);
        System.out.println("Extrinsic State: " + extrinsicState);
        // 执行具体操作
    }
}

// 享元工厂类
class FlyweightFactory {
    private Map flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        if (flyweights.containsKey(key)) {
            return flyweights.get(key);
        } else {
            Flyweight flyweight = new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
            return flyweight;
        }
    }
}



public class Main {

    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        // 获取享元对象
        Flyweight flyweight1 = factory.getFlyweight("key1");
        Flyweight flyweight2 = factory.getFlyweight("key1");

        // 调用享元对象的操作方法,传入外部状态
        flyweight1.operation("state1");
        flyweight2.operation("state2");
    }


}

在这个简单的示例代码中,我们创建了一个具体享元类ConcreteFlyweight,它包含了内部状态intrinsicStateFlyweightFactory是享元工厂类,它维护了一个享元对象的池,并通过getFlyweight方法返回具体的享元对象。内部状态在具体享元对象内部管理,而外部状态由客户端传入。

客户端代码中,首先通过工厂类获取两个享元对象flyweight1flyweight2,他们共享了同一个享元对象,然后分别调用它们的operation方法,传入外部状态。从而实现了共享内部状态,同时处理各自的外部状态。

你可能感兴趣的:(#,设计模式,享元模式,java,开发语言)