-
意图:
运用共享技术有效地支持大量细粒度的对象。 -
动机:
-
适用性:
当一下情况都成立时使用Flyweight模式:
a. 一个应用使用了大量的对象。
b. 完全由于使用大量的对象,造成很大的存储开销。
c. 对象大多数状态都可变为外部状态。
d. 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
e. 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识将返回真值。 -
结构:
下面的对象图说明了如何共享flyweight。
-
参与者:
a. Flyweight:
描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。
b. ConcreteFlyweight:
实现Flyweiht接口,并为内部状态(如果有的话)增加存储空间。
ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即它必须独立于ConcreteFlyweight对象的场景
c. UnsharedConcreteFlyweight:
并非所有的Flyweight子类都需要被共享。
Flyweight接口使共享成为可能,但它并不强制共享。
在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。
d. FlyweightFactory:
创建并管理flyweight对象。
确保合理地共享flyweight。
当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个。
e. Client:
维持一个对flyweight的引用。
计算或存储一个(多个)flyweight的外部状态。 -
协作:
a. flyweight执行时所需的状态必定是内部的或外部的。内部状态存储于ConcreteFlyweight对象之中;而外部对象则由Client对象存储或计算。当用户调用flyweight对象的操作时,将该状态传递给它。
b. 用户不应该直接对ConcreteFlyweight类进行实例化,而只能从FlyweightFactory对象得到ConcreteFlyweight对象,这可以保证它们适当的进行共享。 -
效果:
共享的Flyweight越多,存储节约也就越多。 -
实现:
在实现Flyweight模式时,注意以下几点:
a. 删除外部状态
b. 管理共享对象 -
代码示例:
public interface Flyweight { public void operation(int extrinsicState); } public class ConcreteFlyweight implements Flyweight{ private int intrinsicState; @Override public void operation(int extrinsicState) { System.out.println("This is Operation, extrinsicState is" + extrinsicState); } } public class UnsharedConcreteFlyweight implements Flyweight{ private int allState; @Override public void operation(int extrinsicState) { System.out.println("This is Operation, extrinsicState is" + extrinsicState); } } public class FlyweightFactory { private Map<Integer, Flyweight> flyweights; public FlyweightFactory(Map<Integer, Flyweight> flyweights) { this.flyweights = flyweights; } public Flyweight getFlyweight(Integer key) { if (flyweights.containsKey(key)) { return flyweights.get(key); } else { flyweights.put(key, new ConcreteFlyweight()); return flyweights.get(key); } } } public class Client { public static void main(String[] args) { FlyweightFactory flyweightFactory = new FlyweightFactory(new HashMap<Integer, Flyweight>()); Flyweight flyweight = flyweightFactory.getFlyweight(1); flyweight.operation(1); } }
-
已知应用:
-
相关模式:
Flyweight模式通常和Composite模式结合起来,用共享节点的有向无环图实现一个逻辑上的层次结构。
通常,最好用Flyweight实现State和Strategy对象。
FLYWEIGHT(享元)-- 对象结构型模式
最新推荐文章于 2024-07-04 09:24:51 发布
本文介绍了Flyweight模式在大量对象场景中的应用,通过共享减少存储开销,强调了Flyweight对象的结构、参与者角色以及如何通过FlyweightFactory管理共享。同时提到了与Composite模式的结合使用情况。
摘要由CSDN通过智能技术生成