java設計模式10:Flyweight

來源:互聯網
上載者:User

享元模式是對象的結構模式。

享元模式以共用的方式高效地支援大量的細粒度對象。享元對象能做到共用的關鍵是區分內蘊狀態(Internal State)和外蘊狀態(External State).

一個內蘊狀態是儲存在享元對象內部的,並且是不會隨環境改變而有所不同的。因此,一個享元可以具有內蘊狀態並可以共用。

一個外蘊狀態是可隨環境改變而改變的,不可以共用的狀態。享元對象的外蘊狀態必須由用戶端儲存,並在享元對象被建立之後,在需要使用的時候再傳入到享元對象內部。

外蘊狀態不可以影響享元對象的內蘊狀態。換句話說:它們是相互獨立的。

單純享元模式

   

複合享元模式

 

從上面的類圖可以看出,在複合享元模式中,享元對象構成合成模式。因此,複合享元模式實際上是單純享元模式與合成模式的組合。

在單純享元模式中,所有的享元模式對象都是可以共用的

1、抽象享元角色:此角色是所有的具體享元類的超類,為這些類規定出需要實現的公用介面。那些需要外蘊狀態(External State)的操作可以通過調用商業方法以參數形式傳入。
2、具體享元角色:實現抽象享元角色所規定的介面。如果有內蘊狀態的話,必須負責為內蘊狀態提供儲存空間。享元對象的內蘊狀態必須與對象所處的周圍環境無關,從而使得享元對象可以在系統內共用。
3、享元工廠角色:本角色負責建立和管理享元角色。本角色必須保證享元對象可以被系統適當地共用。當一個用戶端對象調用一個享元對象的時候,享元工廠角色會檢查系統中是否有一個複合要求的享元對象。如果已經有了,享元工廠角色就應當提供這個已有的享元對象;如果系統中沒有一個適當的享元對象的話,享元工廠角色就應當建立一個合適的享元對象。
4、用戶端角色:本角色需要維護一個對所有享元對象的引用。本角色需要自行儲存所有享元對象的外蘊狀態。

範例程式碼:

內蘊狀態由intrinsicState儲存 ,所有的內蘊狀態在對象被建立之後,就不可再改變了

外蘊狀態通過operation進行設定,由用戶端在需要的時候進行調用,並改變。

以下的代碼中,雖然申請了3個享元對象,但實際上建立的享元對象只有2個,這就是共用的含 義。

package com.javapatterns.flyweight.simple;

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");

factory.checkFlyweight();
}
}

 

 

package com.javapatterns.flyweight.simple;

import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;

public class FlyweightFactory
{
private HashMap flies = new HashMap();

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()=============");
}

}

 

 

 

package com.javapatterns.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.print( "\nIntrinsic State = " + intrinsicState +
", Extrinsic State = " + state);
}
}

 

 

package com.javapatterns.flyweight.simple;

abstract public class Flyweight
{
abstract public void operation(String state);
}

 

 

 

複合享元模式:

從圖上理解是比較容易的,但書中的代碼著實讓人暈的很,索性先跳過。
 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.