共享对象,避免浪费的 Flyweight模式

Flyweight模式

应用场景

  • 一个系统有大量的对象
  • 这些对象耗费大量的内存
  • 这些对象的状态中的大部分都可以外部化
  • 这些对象可以按照内部状态分成很多的组,当把外部.对象从对象中剔除时,每一个组都可以仅用一个对象代替

本质

  • 分离与共享

优点

  • 大幅度地降低内存中对象的数量, 节省内存空间

缺点

  • 享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化
  • 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间变长

角色

  • Flyweight:
    按照通常方式编写程序会导致程序变重,所以如果能够共享时,率会比较好。Flyweight角色表示的就是那些实力会被共享的类。

  • FlyweightFactory
    FlyweightFactory角色是生成Flyweight角色的工厂,在工厂中生成Flyweight角色可以实现共享实例。

  • Client
    Client角色使用FlyweightFactory角色来生成Flyweight角色。

设计模式的类图

在这里插入图片描述

示例程序

示例程序的类图

在这里插入图片描述

示例代码
public abstract class FlyWeight {
	public abstract void operation(int extrinsicState);
}
public class ConcreteFlyWeight extends FlyWeight {

	@Override
	public void operation(int extrinsicState) {
		System.out.println("具体的FlyWeight "+extrinsicState);
	}
}
public class UnsharedFlyWeight extends FlyWeight {

	@Override
	public void operation(int extrinsicState) {
		System.out.println("不具体的FlyWeight "+extrinsicState);
	}
}
public class FlyWeightFactory {

	private Hashtable<String, FlyWeight> hashtable = new Hashtable<String, FlyWeight>();

	public FlyWeight getFlyWeight(String key) {
		if (hashtable.containsKey(key)) {
			return hashtable.get(key);
		} else {
			ConcreteFlyWeight concreteFlyWeight = new ConcreteFlyWeight();
			hashtable.put(key, concreteFlyWeight);
			return concreteFlyWeight;
		}
	}

	public int getCount() {
		return hashtable.size();
	}
}
public class Client {

	public static void main(String[] args) {
		int extrinsicstate = 10;

		FlyWeightFactory factory = new FlyWeightFactory();
		FlyWeight f1 = factory.getFlyWeight("X");
		f1.operation(--extrinsicstate);
		System.out.println(f1);
		FlyWeight f2 = factory.getFlyWeight("Y");
		f2.operation(--extrinsicstate);

		FlyWeight f3 = factory.getFlyWeight("Z");
		f3.operation(--extrinsicstate);

		FlyWeight f4 = new UnsharedFlyWeight();
		f4.operation(--extrinsicstate);

	}
}

拓展思路

相关设计模式

  • Proxy模式
    如果生成实例的处理需要花费较长时间,那么使用Flyweight模式可以提高程序的处理速度。
    而Proxy模式则是通过设置代理提高程序的处理速度。

  • Composite模式
    有时可以使用Flyweight模式共享Composite模式中的Leaf角色

  • Singleton模式
    在FlyweightFactony 角色中有时会使用Singleton模式。
    此外,如果使用了Singleton模式,由于只会生成个Singleton角色,因此所有使用该实例的
    地方都共享同一个实例。在Singleton角色的实例中只持有intrinsic可共享信息。

满足的原则

  • 依赖倒置原则
  • 迪米特法则
  • 里氏替换原则
  • 单一职责原则
  • 开闭原则
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值