標籤:java設計模式 flyweight
轉載請註明出處:http://blog.csdn.net/l1028386804/article/details/45568799
一、概述
運用共用技術有效地支援大量細粒度的對象。
二、適用性
當都具備下列情況時,使用Flyweight模式:
1.一個應用程式使用了大量的對象。
2.完全由於使用大量的對象,造成很大的儲存開銷。
3.對象的大多數狀態都可變為外部狀態。
4.如果刪除對象的外部狀態,那麼可以用相對較少的共用對象取代很多組對象。
5.應用程式不依賴於對象標識。由於Flyweight對象可以被共用,對於概念上明顯有別的對象,標識測試將返回真值。
三、參與者
1.Flyweight 描述一個介面,通過這個介面flyweight可以接受並作用於外部狀態。
2.ConcreteFlyweight 實現Flyweight介面,並為內部狀態(如果有的話)增加儲存空間。 ConcreteFlyweight對象必須是可共用的。它所儲存的狀態必須是內部的;即,它必須獨立於ConcreteFlyweight對象的情境。
3.UnsharedConcreteFlyweight 並非所有的Flyweight子類都需要被共用。Flyweight介面使共用成為可能,但它並不強制共用。 在Flyweight對象結構的某些層次,UnsharedConcreteFlyweight對象通常將ConcreteFlyweight對象作為子節點。
4.FlyweightFactory 建立並管理flyweight對象。 確保合理地共用flyweight。當使用者請求一個flyweight時,FlyweightFactory對象提供一個已建立的執行個體或者建立一個(如果不存在的話)。
四、類圖
五、樣本
Flyweight
package com.lyz.design.flyweight;/** * Flyweight * @author liuyazhuang * */public interface Flyweight { void action(int arg);}
ConcreteFlyweight
package com.lyz.design.flyweight;/** * ConcreteFlyweight * @author liuyazhuang * */public class FlyweightImpl implements Flyweight { public void action(int arg) { // TODO Auto-generated method stub System.out.println("參數值: " + arg); }}
FlyweightFactory
package com.lyz.design.flyweight;import java.util.HashMap;import java.util.Map;/** * FlyweightFactory * @author liuyazhuang * */public class FlyweightFactory { private static Map flyweights = new HashMap(); public FlyweightFactory(String arg) { flyweights.put(arg, new FlyweightImpl()); } public static Flyweight getFlyweight(String key) { if (flyweights.get(key) == null) { flyweights.put(key, new FlyweightImpl()); } return (Flyweight) flyweights.get(key); } public static int getSize() { return flyweights.size(); }}
Test
package com.lyz.design.flyweight;/** * Test * @author liuyazhuang */public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Flyweight fly1 = FlyweightFactory.getFlyweight("a"); fly1.action(1); Flyweight fly2 = FlyweightFactory.getFlyweight("a"); System.out.println(fly1 == fly2); Flyweight fly3 = FlyweightFactory.getFlyweight("b"); fly3.action(2); Flyweight fly4 = FlyweightFactory.getFlyweight("c"); fly4.action(3); Flyweight fly5 = FlyweightFactory.getFlyweight("d"); fly4.action(4); System.out.println(FlyweightFactory.getSize()); }}
淺談JAVA設計模式之——享元模式(Flyweight)