设计模式(十一)----- 享元模式(Flyweight)----(JAVA版)

享元模式:

       运用共享技术有效地支持大量细粒度的对象

享元模式的重点在于分离变与不变。把一个对象的状态分成内部状态和外部状态,内部状态是不变的,外部状态是可变的。然后通过共享不变的部分,达到减少对象数量并节约内存的目的。
内部状态:通常指的是包含在享元对象内部的、对象本身的状态,不会随享元环境而变化,因此可共享。
外部状态:是享元对象之外的状态,取决于使用享元的场景,会根据使用场景而变化,因此不可共享。如果享元对象需要这些外部状态的话,可以从外部传到外部状态中。
外部状态和内部状态是相互独立的,外部状态的变换不会因起内部状态的变化。
享元对象的优点:减少对象数量,节省内存空间。
享元模式的缺点:维护共享对象,需要额外的开销(用一个线程来维护垃圾回收)。
享元模式的本质:分离与共享。

适用性:

当都具备下列情况时,使用享元模式

1.一个应用程序使用了大量的对象

2.完全是由于使用大量的对象,造成很大的存储开销

3.对象的大多数状态都可变为外部状态

4.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象

5.应用程序不依赖于对象标识。由于享元模式对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值

参与者:

1.Flyweight

定义一个接口,通过这个接口Flyweight可以接受并作用于外部状态:

2.ConcreteFlyweight

是对Flyweight接口的实现,并且为内部状态(如果有的话)增加存储空间

它必须是可被共享的,它所存储的状态必须是内部的;即它必须独立于ConcreteFlyweight对象的场景

3.UnsharedConcreteFlyweight

并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为了可能,但它并不强制共享。

在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点

4.FlyweightFactory

创建并管理Flyweight对象,确保合理地共享Flyweight,当用户请求一个Flyweight时,此类对象提供一个已存在的实例,或者是重新创建一个,如果这个实例不存在的话

类图


一个例子

1.Flyweight

public interface Flyweight {
 void action(int arg);
}

2.ConcreteFlyweight

public class FlyweightImpl implements Flyweight{
 @Override
 public void action(int arg) {
  System.out.println("参数值为:" + arg);
 }
}

3.FlyweightFactory

public class FlyweightFactory {
 private static Map<String, Flyweight> flyweights = new HashMap<String, Flyweight>();

 public FlyweightFactory(String key) {
  flyweights.put(key, new FlyweightImpl());
 }

 public static Flyweight getFlyweight(String key) {
  if (flyweights.get(key) == null)
   flyweights.put(key, new FlyweightImpl());
  return flyweights.get(key);
 }

 public static int getSize() {
  return flyweights.size();
 }
}

4.Test

public class Test {
 public static void main(String[] args) {
  Flyweight f1 = FlyweightFactory.getFlyweight("a");
  f1.action(1);
  Flyweight f2 = FlyweightFactory.getFlyweight("a");
  System.out.println(f1 == f2);
  Flyweight f3 = FlyweightFactory.getFlyweight("b");
  f3.action(2);
  Flyweight f4 = FlyweightFactory.getFlyweight("c");
  f4.action(3);
  Flyweight f5 = FlyweightFactory.getFlyweight("d");
  f5.action(4);
  System.out.println(FlyweightFactory.getSize());

 }
}

result:

参数值为:1
true
参数值为:2
参数值为:3
参数值为:4
4


参考 资料:

1.http://rainbowj234.diandian.com/post/2011-11-21/6989006

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值