结构型模式之享元模式

享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在优化大量细粒度对象的内存使用和性能。
在享元模式中,对象分为两种类型:可共享的(享元)对象和不可共享的对象。可共享对象可以在多个上下文中共享并重复使用,从而节省内存。
而不可共享对象则是每个上下文独自拥有的,不能共享。

享元模式的关键思想是将相似对象的共享部分提取出来,形成共享对象池。当需要创建新对象时,首先检查对象池中是否存在相同的对象实例。
如果存在,直接返回已存在的对象;如果不存在,则创建一个新的对象,并将其添加到对象池中以供以后使用。
通过共享对象,享元模式可以有效减少内存使用,特别适用于系统中存在大量类似对象且这些对象占用大量内存的情况。它可以提高系统的性能和效率。

然而,享元模式也带来了一些限制。由于共享对象的状态被多个对象共享,因此在某些情况下需要注意线程安全性和数据一致性的问题。
另外,共享对象的创建和管理可能会增加系统的复杂性。

提供demo版代码更容易理解

/**
 * @author zhou
 *  抽象享元类
 */
interface Flyweight {
    void operation();
}

/**
 * @author zhou
 *  享元工厂类
 */
class FlyweightFactory {
    private Map<String, Flyweight> 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;
        }
    }
}

/**
 * @author zhou
 *  具体享元类
 */
class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

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

    @Override
    public void operation() {
        System.out.println("具体享元对象的操作,内部状态为:" + intrinsicState);
    }
}

/**
 * @author zhou
 *  客户端代码
 */
public class Client {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        
        // 获取并使用享元对象
        Flyweight flyweight1 = factory.getFlyweight("A");
        flyweight1.operation();

        Flyweight flyweight2 = factory.getFlyweight("B");
        flyweight2.operation();

        Flyweight flyweight3 = factory.getFlyweight("A"); // 已存在的共享对象
        flyweight3.operation();
    }
}

在上述示例中,Flyweight是抽象享元类,定义了享元对象的公共接口。ConcreteFlyweight是具体享元类,实现了抽象享元类的接口,并保存了内部状态。

FlyweightFactory是享元工厂类,负责创建和管理享元对象。它维护一个对象池(使用HashMap),在获取享元对象时首先检查是否已存在相同的对象,
如果存在则返回已有对象,否则创建新的对象并添加到对象池中。

在客户端代码中,通过调用FlyweightFactory的getFlyweight方法可以获取享元对象,并进行操作。
示例中获取了两个不同的享元对象和一个已存在的享元对象,验证了共享和重复使用的效果。

你可能感兴趣的:(计算机基础,享元模式,java,开发语言)