10.18

享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。享元模式适用于需要创建大量相似对象的情况,通过共享这些对象的内部状态,可以显著减少对象的数量。

下面是一个简单的Java代码示例,演示了享元模式的实现:

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

// 共享的抽象享元类
interface Flyweight {
    void operation();
}

// 具体享元类
class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

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

    public void operation() {
        System.out.println("ConcreteFlyweight: " + intrinsicState);
    }
}

// 享元工厂类
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;
        }
    }
}

// 客户端代码
public class FlyweightPatternExample {
    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,其中包含一个 operation() 方法。

然后,我们实现了具体享元类 ConcreteFlyweight,它实现了 Flyweight 接口,并持有一个内部状态 intrinsicState

接着,我们创建了享元工厂类 FlyweightFactory,它维护了一个享元对象的缓存池 flyweights。在 getFlyweight() 方法中,我们通过检查缓存池是否存在对应的享元对象,如果存在则直接返回,否则创建新的享元对象并添加到缓存池中。

在客户端代码中,我们实例化了享元工厂对象 FlyweightFactory,并通过调用 getFlyweight() 方法获取享元对象。在多次获取同一个内部状态的享元对象时,实际上是获取的同一个对象实例。

享元模式的关键思想是共享对象的内部状态,以减少对象的数量。通过共享相同的内部状态,可以节省内存空间,并提高系统的性能。需要注意的是,享元模式将对象的内部状态与外部状态分离,内部状态是可以共享的,而外部状态是变化的,每个对象都需要独立维护。

posted @   liuxuechao  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示