Java与模式之享元(Flyweigt)模式
上一篇 / 下一篇 2008-04-05 14:19:30 / 个人分类:Java与模式
享元模式是对象的结构模式[GOF95]。享元模式以共享的方式高效的支持大量的细粒度对象。
//单纯享元模式的结构
//抽象享元角色
abstract public class Flyweight
{
abstract public void operation(String state);
}
//具体享元(ConcreteFlyweight)角色
public class ConcreteFlyweight extends Flyweight
{
private Character intrinsicState = null;
public ConcreteFlyweight(Character state)
{
this.intrinsicState = state;
}
public void operation(String state)
{
System.out.print( "\nIntrinsic State = " + intrinsicState +
", Extrinsic State = " + state);
}
}
//享元工厂(FlyweightFactory)角色
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
public class FlyweightFactory
{
private HashMap flies = new HashMap();
/**
* @link aggregation
* @directed
* @clientRole Flyweights
*/
private Flyweight lnkFlyweight;
public FlyweightFactory(){}
public synchronized 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()
{
Flyweight fly ;
int i = 0;
System.out.println("\n==========checkFlyweight()=============");
for ( Iterator it = flies.entrySet().iterator() ; it.hasNext() ; )
{
Map.Entry e = (Map.Entry) it.next();
System.out.println("Item " + (++i) + " : " + e.getKey());
}
System.out.println("==========checkFlyweight()=============");
}
}
//客户端(Client)角色
public class Client
{
private static FlyweightFactory factory;
static public void main(String[] args)
{
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");
// intrinsic Flyweight
factory.checkFlyweight();
}
}
//复合享元模式的结构
//抽象享元角色
abstract public class Flyweight
{
abstract public void operation(String state);
}
//具体享元(ConcreteFlyweight)角色
public class ConcreteFlyweight extends Flyweight
{
private Character intrinsicState = null;
public ConcreteFlyweight(Character state)
{
this.intrinsicState = state;
}
public void operation(String state)
{
System.out.print( "\nInternal State = " +
intrinsicState + " Extrinsic State = " + state );
}
}
//复合享元(UnsharableFlyweight)角色
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
public class ConcreteCompositeFlyweight extends Flyweight
{
private HashMap flies = new HashMap(10);
/**
* @link aggregation
* @directed
* @clientRole Composite
*/
private Flyweight flyweight;
public ConcreteCompositeFlyweight()
{
}
public void add(Character key, Flyweight fly)
{
flies.put(key, fly);
}
public void operation(String extrinsicState)
{
Flyweight fly = null;
for ( Iterator it = flies.entrySet().iterator() ; it.hasNext() ; )
{
Map.Entry e = (Map.Entry) it.next();
fly = (Flyweight) e.getValue();
fly.operation(extrinsicState);
}
}
}
//享元工厂(FlyweightFactory)角色
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
public class FlyweightFactory
{
private HashMap flies = new HashMap();
/**
* @link aggregation
* @directed
* @clientRole Flyweights
*/
private Flyweight lnkFlyweight;
public FlyweightFactory(){}
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()
{
Flyweight fly ;
int i = 0 ;
System.out.println("\n==========checkFlyweight()=============");
for ( Iterator it = flies.entrySet().iterator() ; it.hasNext() ; )
{
Map.Entry e = (Map.Entry) it.next();
System.out.println( "Item " + (++i) + " : " + e.getKey());
}
System.out.println("\n==========checkFlyweight()=============");
}
}
//客户端(Client)角色
public class Client
{
private static FlyweightFactory factory;
public static void main(String[] args)
{
factory = new FlyweightFactory();
Flyweight fly;
/* fly = factory.factory(new Character('a'));
fly.operation();
fly = factory.factory(new Character('b'));
fly.operation();
fly = factory.factory(new Character('a'));
fly.operation();
*/
fly = factory.factory("abc");
fly.operation("Composite Call");
// intrinsic Flyweight
factory.checkFlyweight();
}
}
一个咖啡摊的例子
package com.javapatterns.flyweight.coffeestall;
public abstract class Order
{
public abstract void serve();
public abstract String getFlavor();
}
package com.javapatterns.flyweight.coffeestall;
public class Flavor extends Order
{
private String flavor;
public Flavor(String flavor)
{
this.flavor = flavor;
}
public String getFlavor()
{
return this.flavor;
}
public void serve()
{
System.out.println("Serving flavor " + flavor );
}
}
package com.javapatterns.flyweight.coffeestall;
public class FlavorFactory
{
/**
* @label Flyweight
* @supplierCardinality 0..*
* @link aggregation
*/
private Order[] flavors = new Flavor[10];
private int rdersMade = 0;
private int totalFlavors = 0 ;
public Order getOrder(String flavorToGet)
{
if (ordersMade > 0)
{
for (int i = 0; i < ordersMade; i++)
{
if (flavorToGet.equals((flavors[i]).getFlavor()))
{
return flavors[i];
}
}
}
flavors[ordersMade] = new Flavor(flavorToGet);
totalFlavors++;
return flavors[ordersMade++];
}
public int getTotalFlavorsMade()
{
return totalFlavors;
}
}
package com.javapatterns.flyweight.coffeestall;
public class Client
{
//the flavors ordered
/**
* @supplierCardinality 0..*
*/
private static Order[] flavors = new Flavor[100];
private static int rdersMade = 0;
private static FlavorFactory flavorFactory;
private static void takeOrders(String aFlavor)
{
flavors[ordersMade++] = flavorFactory.getOrder(aFlavor);
}
public static void main(String[] args)
{
flavorFactory = new FlavorFactory();
takeOrders("Black Coffee");
takeOrders("Capucino");
takeOrders("Espresso");
takeOrders("Espresso");
takeOrders("Capucino");
takeOrders("Capucino");
takeOrders("Black Coffee");
takeOrders("Espresso");
takeOrders("Capucino");
takeOrders("Black Coffee");
takeOrders("Espresso");
for (int i = 0; i < ordersMade; i++)
{
flavors[i].serve();
}
System.out.println("\nTotal teaFlavor objects made: " +
flavorFactory.getTotalFlavorsMade());
}
}
咖啡屋的例子
package com.javapatterns.flyweight.coffeeshop;
public abstract class Order
{
public abstract void serve(Table table);
public abstract String getFlavor();
/** @link dependency */
/*#Table lnkTable;*/
}
package com.javapatterns.flyweight.coffeeshop;
public class Flavor extends Order
{
private String flavor;
public Flavor(String flavor)
{
this.flavor = flavor;
}
public String getFlavor()
{
return this.flavor;
}
public void serve(Table table)
{
System.out.println("Serving table " + table.getNumber() + " with flavor " + flavor );
}
}
package com.javapatterns.flyweight.coffeeshop;
public class FlavorFactory
{
/**
* @label Flyweight
* @link aggregation
*/
private Order[] flavors = new Flavor[10];
private int rdersMade = 0;
private int totalFlavors = 0 ;
public Order getOrder(String flavorToGet)
{
if (ordersMade > 0)
{
for (int i = 0; i < ordersMade; i++)
{
if (flavorToGet.equals((flavors[i]).getFlavor()))
{
return flavors[i];
}
}
}
flavors[ordersMade] = new Flavor(flavorToGet);
totalFlavors++;
return flavors[ordersMade++];
}
public int getTotalFlavorsMade()
{
return totalFlavors;
}
}
package com.javapatterns.flyweight.coffeeshop;
public class Table
{
private int number;
public Table(int number)
{
this.number = number;
}
public void setNumber(int number)
{
this.number = number;
}
public int getNumber()
{
return number;
}
}
package com.javapatterns.flyweight.coffeeshop;
public class Client
{
//the flavors ordered
/**
* @label Creates
*/
private static Order[] flavors = new Flavor[100];
private static int rdersMade = 0;
private static FlavorFactory flavorFactory;
/** @link dependency */
/*#Table lnkTable;*/
private static void takeOrders(String aFlavor)
{
flavors[ordersMade++] = flavorFactory.getOrder(aFlavor);
}
public static void main(String[] args)
{
flavorFactory = new FlavorFactory();
takeOrders("Black Coffee");
takeOrders("Capucino");
takeOrders("Espresso");
takeOrders("Espresso");
takeOrders("Capucino");
takeOrders("Capucino");
takeOrders("Black Coffee");
takeOrders("Espresso");
takeOrders("Capucino");
takeOrders("Black Coffee");
takeOrders("Espresso");
for (int i = 0; i < ordersMade; i++)
{
flavors[i].serve(new Table(i));
}
System.out.println("\nTotal teaFlavor objects made: " +
flavorFactory.getTotalFlavorsMade());
}
}
相关阅读:
- Java与模式之装饰(Decorator)模式 (liuzhili3608, 2008-4-03)
- Java与模式之代理(Proxy)模式 (liuzhili3608, 2008-4-05)
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG: java与模式
标题搜索
日历
|
|||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | 5 | |||||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 | |||
| 13 | 14 | 15 | 16 | 17 | 18 | 19 | |||
| 20 | 21 | 22 | 23 | 24 | 25 | 26 | |||
| 27 | 28 | 29 | 30 | 31 | |||||
数据统计
- 访问量: 426
- 日志数: 33
- 建立时间: 2008-03-25
- 更新时间: 2008-07-13

