享元模式(FlyWeight Pattern)

本文介绍了享元模式这一对象结构模式,详细解释了如何通过区分内蕴状态和外蕴状态实现对象共享,从而支持大量细粒度对象的高效管理。文中提供了单纯享元模式和复合享元模式的Java代码示例。

    享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。
    享元对象能做到共享的关键是区分内蕴状态和外蕴状态。
    一个内蕴状态是存储在享元对象内部的,并且是不会随环境改变而有所不同的。因此,一个享元可以具有内蕴状态并可以共享。
    一个外蕴状态时随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。
    外蕴状态不可以影响享元对象的内蕴状态。换句话说,它们是相互独立的。
一、享元模式的种类

享元模式(FlyWeight <wbr>Pattern)
享元模式(FlyWeight <wbr>Pattern)


二、单纯享元模式
1、模式结构
享元模式(FlyWeight <wbr>Pattern)
享元模式(FlyWeight <wbr>Pattern)
 
 
2、java代码
FlyWeight抽象类:
package flyweight.simple;
abstract public class FlyWeight {
 abstract public void operation(String state);
}
 
ConcreteFlyWeight类:
package flyweight.simple;
public class ConcreteFlyWeight extends FlyWeight {
 private Character intrinsicState = null;
 public ConcreteFlyWeight(Character state){
  this.intrinsicState = state;
 }
 public void operation(String state) {
  System.out.println("IntrinsicState is " + intrinsicState
                + " and ExtrinsicState is " + state + "。。。。。。");
 }
}
 
FlyWeightFactory类:
package flyweight.simple;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class FlyWeightFactory { 
 private HashMap flies = new HashMap();
 public FlyWeightFactory(){
  System.out.println("Factory is created。。。。。。");
 }
 public FlyWeight factory(Character state){
  if(flies.containsKey(state)){
   return (FlyWeight)flies.get(state);
  }else {
   FlyWeight fly = new ConcreteFlyWeight(state);
   flies.put(state, fly);
   return fly;
  }
 }
 public void checkFlyWeight(){
  int i = 0;
  System.out.println("------------checkFlyWeight---------------");
  for(Iterator iter = flies.entrySet().iterator();iter.hasNext();){
   Map.Entry e = (Map.Entry)iter.next();
   System.out.println("Item" + (++i) + ":" + e.getKey());
  }
  System.out.println("------------checkFlyWeight---------------");
 }
}
 
Client类:
package flyweight.simple;
public class Client {
 public static void main(String args[]){
  FlyWeightFactory factory = new FlyWeightFactory();
  FlyWeight fly = factory.factory(new Character('a'));
  fly.operation("First Call");
  fly = factory.factory(new Character('b'));
  fly.operation("Second Call");
  fly = factory.factory(new Character('a'));
  fly.operation("Third Call");
  factory.checkFlyWeight();
 }
}
 
三、复合享元模式
1、模式结构
享元模式(FlyWeight <wbr>Pattern)
享元模式(FlyWeight <wbr>Pattern)
 
 
2、java代码
FlyWeight抽象类:
package flyweight.composite;
abstract public class FlyWeight {
 abstract public void operation(String state);
}
 
ConcreteFlyWeight类:
package flyweight.composite;
public class ConcreteFlyWeight extends FlyWeight{
 private Character intrinsicState = null;
 public ConcreteFlyWeight(Character state){
  this.intrinsicState = state;
 }
 public void operation(String state) {
  System.out.println("IntrinsicState is " + intrinsicState
                + " and ExtrinsicState is " + state + "。。。。。。");
 }
}
 
ConcreteCompositeFlyWeight类:
package flyweight.composite;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class ConcreteCompositeFlyWeight extends FlyWeight{
 private HashMap flies = new HashMap(10);
 public ConcreteCompositeFlyWeight(){
  System.out.println("ConcreteCompositeFlyWeight is created......");
 }
    public void add(Character key ,FlyWeight fly){
     flies.put(key, fly);
    }
 public void operation(String state) {
  FlyWeight fly = null;
  for(Iterator iter = flies.entrySet().iterator();iter.hasNext();){
   Map.Entry e = (Map.Entry)iter.next();
   fly = (FlyWeight)e.getValue();
   fly.operation(state);
  }
 }
}
 
FlyWeightFactory类:
package flyweight.composite;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class FlyWeightFactory {
 private HashMap flies = new HashMap();
 public FlyWeightFactory(){
  System.out.println("FlyWeightFactory is created......");
 }
 public FlyWeight factory(String compositeState){
  ConcreteCompositeFlyWeight compositeFly = new ConcreteCompositeFlyWeight();
  int length = compositeState.length();
  Character state = null;
  for(int i=0 ; i<length ; i++){
   state = new Character(compositeState.charAt(i));
   System.out.println("factory(" + state + ")");
   compositeFly.add(state, this.factory(state));
  }
  return compositeFly;
 }
 public FlyWeight factory(Character state) {
  if(flies.containsKey(state)){
   return (FlyWeight)flies.get(state);
  }else{
   FlyWeight fly = new ConcreteFlyWeight(state);
   flies.put(state, fly);
   return fly;
  }
 }
 public void checkFlyWeight(){
  int i = 0;
  System.out.println("------------checkFlyWeight---------------");
  for(Iterator iter = flies.entrySet().iterator();iter.hasNext();){
   Map.Entry e = (Map.Entry)iter.next();
   System.out.println("Item" + (++i) + ":" + e.getKey());
  }
  System.out.println("------------checkFlyWeight---------------");
 }
}
 
Client类:
 package flyweight.composite;

public class Client {
 public static void main(String args[]){
  FlyWeightFactory factory = new FlyWeightFactory();
  FlyWeight fly = factory.factory("abc");
  fly.operation("Composite Call");
  factory.checkFlyWeight();
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值