實現物件的複用——享元模式(三)
14.3 完整解決方案
為了節約儲存空間,提高系統效能,Sunny公司開發人員使用享元模式來設計圍棋軟體中的棋子,其基本結構如圖14-4所示:
圖14-4 圍棋棋子結構圖
在圖14-4中,IgoChessman充當抽象享元類,BlackIgoChessman和WhiteIgoChessman充當具體享元類,IgoChessmanFactory充當享元工廠類。完整程式碼如下所示:
import java.util.*;
//圍棋棋子類:抽象享元類
abstract class IgoChessman {
public abstract String getColor();
public void display() {
System.out.println("棋子顏色:" + this.getColor());
}
}
//黑色棋子類:具體享元類
class BlackIgoChessman extends IgoChessman {
public String getColor() {
return "黑色";
}
}
//白色棋子類:具體享元類
class WhiteIgoChessman extends IgoChessman {
public String getColor() {
return "白色";
}
}
//圍棋棋子工廠類:享元工廠類,使用單例模式進行設計
class IgoChessmanFactory {
private static IgoChessmanFactory instance = new IgoChessmanFactory();
private static Hashtable ht; //使用Hashtable來儲存享元物件,充當享元池
private IgoChessmanFactory() {
ht = new Hashtable();
IgoChessman black,white;
black = new BlackIgoChessman();
ht.put("b",black);
white = new WhiteIgoChessman();
ht.put("w",white);
}
//返回享元工廠類的唯一例項
public static IgoChessmanFactory getInstance() {
return instance;
}
//通過key來獲取儲存在Hashtable中的享元物件
public static IgoChessman getIgoChessman(String color) {
return (IgoChessman)ht.get(color);
}
}
編寫如下客戶端測試程式碼:
class Client {
public static void main(String args[]) {
IgoChessman black1,black2,black3,white1,white2;
IgoChessmanFactory factory;
//獲取享元工廠物件
factory = IgoChessmanFactory.getInstance();
//通過享元工廠獲取三顆黑子
black1 = factory.getIgoChessman("b");
black2 = factory.getIgoChessman("b");
black3 = factory.getIgoChessman("b");
System.out.println("判斷兩顆黑子是否相同:" + (black1==black2));
//通過享元工廠獲取兩顆白子
white1 = factory.getIgoChessman("w");
white2 = factory.getIgoChessman("w");
System.out.println("判斷兩顆白子是否相同:" + (white1==white2));
//顯示棋子
black1.display();
black2.display();
black3.display();
white1.display();
white2.display();
}
}
編譯並執行程式,輸出結果如下:
判斷兩顆黑子是否相同:true 判斷兩顆白子是否相同:true 棋子顏色:黑色 棋子顏色:黑色 棋子顏色:黑色 棋子顏色:白色 棋子顏色:白色 |
從輸出結果可以看出,雖然我們獲取了三個黑子物件和兩個白子物件,但是它們的記憶體地址相同,也就是說,它們實際上是同一個物件。在實現享元工廠類時我們使用了單例模式和簡單工廠模式,確保了享元工廠物件的唯一性,並提供工廠方法來向客戶端返回享元物件。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 實現物件的複用——享元模式(五)物件模式
- 實現物件的複用——享元模式(四)物件模式
- 實現物件的複用——享元模式(二)物件模式
- 實現物件的複用——享元模式(一)物件模式
- 享元模式(c++實現)模式C++
- 物件池與享元模式物件模式
- 設計模式之:享元模式FlyweightPattern的實現設計模式
- Swift 實戰-享元模式Swift模式
- 實驗13:享元模式模式
- 享元模式模式
- 第22章 物件共享,避免建立多物件——享元模式物件模式
- 設計模式 | 享元模式及典型應用設計模式
- 六、享元模式模式
- 享元模式初探模式
- 設計模式----享元模式設計模式
- 設計模式-享元模式設計模式
- 享元模式(Flyweight)模式
- 設計模式之享元模式設計模式
- javascript設計模式享元模式JavaScript設計模式
- 設計模式(十七):享元模式設計模式
- 享元模式 核心程式碼模式
- 分析模式:可複用的物件模型模式物件模型
- 設計模式系列13–享元模式設計模式
- 【大道模式】享元模式-FlyWeight Pattern模式
- 極簡設計模式-享元模式設計模式
- Python設計模式-享元模式Python設計模式
- Java設計模式11——享元模式Java設計模式
- iOS設計模式 (四)享元模式iOS設計模式
- 軟體設計模式————(享元模式)設計模式
- Android開發Message原始碼分析【享元模式|物件池】Android原始碼模式物件
- 【web前端】用javascript實現物件的深複製Web前端JavaScript物件
- 設計模式學習筆記(十二)享元模式及其應用設計模式筆記
- 《JavaScript設計模式與開發實踐》模式篇(9)—— 享元模式JavaScript設計模式
- C#設計模式(13)——享元模式C#設計模式
- Java設計模式之(十一)——享元模式Java設計模式
- 設計模式系列13--享元模式設計模式
- C#設計模式之享元模式C#設計模式
- 通俗 Python 設計模式——享元模式Python設計模式