设计模式——享元模式

享元模式

介绍

享元模式通过共享技术从而实现相同或者相似的对象的重用,从而达到降低系统开销的目的,一般与工厂模式结合使用,包含一个享元工厂类

  • 内部状态

    内部状态是指存储在享元模式内部并且不会随环境改变而改变的状态,内部状态可以共享

  • 外部状态

    外部状态是随环境改变而改变的不可以共享的状态,通常由客户端进行维护,在需要使用的时候传入到内部

角色
  • Flyweight(抽象享元类):一般是接口或者抽象类,其中声明了公共方法,该方法可以向外界提供享元对象的内部数据,同时也可以设置外部数据
  • ConcreteFlyweight(具体享元类):实现抽象享元类声明的方法,其中存储了内部状态
  • UnsharedConcreteFlyweight(非共享具体享元类)
  • FlyweightFactory(享元工厂类):创建并管理享元对象,针对抽象享元类编程
示例代码
//抽象享元类
public abstract class Flyweight {
    //内部状态作为成员变量
    private String intrinsicState;

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

    //外部状态在使用是由外部设置,不保存在享元对象中
    public void operation(String extrinsicState) {
        System.out.println(intrinsicState + " - 外部状态设置:" + extrinsicState);
    }
}
//具体享元对象类A
public class ConcreteFlyweightA extends Flyweight {

    public ConcreteFlyweightA() {
        super("A");
    }
}
//具体享元对象类B
public class ConcreteFlyweightB extends Flyweight {

    public ConcreteFlyweightB() {
        super("B");
    }
}
//享元工厂类
public class FlyweightFactory {
    private HashMap<String, Flyweight> flyweights = new HashMap<>();

    public FlyweightFactory() {
        flyweights.put("A", new ConcreteFlyweightA());
        flyweights.put("B", new ConcreteFlyweightB());
    }

    public Flyweight getFlyweight(String key) {
        if (flyweights.containsKey(key)) {
            return flyweights.get(key);
        } else {
            return null;
        }
    }
}
//客户端
public class Client {
    public static void main(String[] args) {
        FlyweightFactory flyweightFactory = new FlyweightFactory();
        Flyweight flyweightA1 = flyweightFactory.getFlyweight("A");
        Flyweight flyweightA2 = flyweightFactory.getFlyweight("A");
        Flyweight flyweightB1 = flyweightFactory.getFlyweight("B");
        flyweightA1.operation("外部状态A1");
        flyweightA2.operation("外部状态A2");
        flyweightB1.operation("外部状态B1");
        System.out.println(flyweightA1 == flyweightA2);
        System.out.println(flyweightB1 == flyweightA1);

    }
}

源代码请参考 FlyweightPattern

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值