设计模式:享元模式

概述

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享细粒度对象来支持大量细粒度对象的高效共享,避免对象的多次创建,从而减少内存使用。享元模式非常适合用于实现那些包含大量相似对象的系统。

使用场景

  1. 系统需要大量细粒度对象,这些对象的大部分状态是相同的。
  2. 通过共享对象可以显著减少内存使用。
  3. 对象的状态可以分为内部状态和外部状态,内部状态可以共享,而外部状态是特定于对象的。

结构

享元模式的结构包含以下几个部分:

  1. 享元(Flyweight):定义一个接口,供具体享元类实现。
  2. 具体享元(ConcreteFlyweight):实现享元接口,并且共享对象的内部状态。
  3. 非共享具体享元(UnsharedConcreteFlyweight):并非所有的享元对象都可以共享,非共享具体享元类不需要实现共享功能。
  4. 享元工厂(FlyweightFactory):创建和管理享元对象,确保享元对象可以被共享。

代码实现

下面是一个 Java 实现享元模式的例子,展示了如何使用享元模式来管理大量相似的对象。

示例代码:

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

// Flyweight 接口
interface Flyweight {
    void operation(String externalState);
}

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

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

    @Override
    public void operation(String externalState) {
        System.out.println("Intrinsic State: " + intrinsicState + ", External State: " + externalState);
    }
}

// 非共享具体享元类
class UnsharedConcreteFlyweight implements Flyweight {
    private String allState;

    public UnsharedConcreteFlyweight(String allState) {
        this.allState = allState;
    }

    @Override
    public void operation(String externalState) {
        System.out.println("All State: " + allState + ", External State: " + externalState);
    }
}

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

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

// 客户端代码
public class FlyweightPatternDemo {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        Flyweight flyweight1 = factory.getFlyweight("A");
        flyweight1.operation("First Call");

        Flyweight flyweight2 = factory.getFlyweight("A");
        flyweight2.operation("Second Call");

        Flyweight flyweight3 = factory.getFlyweight("B");
        flyweight3.operation("First Call");

        UnsharedConcreteFlyweight unsharedFlyweight = new UnsharedConcreteFlyweight("Unshared");
        unsharedFlyweight.operation("First Call");
    }
}

解释

  1. Flyweight:定义了一个接口,ConcreteFlyweightUnsharedConcreteFlyweight 实现了该接口。
  2. ConcreteFlyweight:具体享元类,实现了享元接口,并且包含可以共享的内部状态。
  3. UnsharedConcreteFlyweight:非共享具体享元类,实现了享元接口,但其状态不能共享。
  4. FlyweightFactory:享元工厂类,用于创建和管理享元对象,确保享元对象可以被共享。
  5. FlyweightPatternDemo:客户端代码,通过享元工厂获取享元对象,并执行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值