GOF設計模式——Flyweight模式

1、什麼是Flyweight模式java

        Flyweight,是輕量級的意思,Flyweight模式旨在使得類的建立、使用變得簡便。如何實現呢?在通常的編程裏面,想要使用一個對象,會經過new的方式建立,那麼每個地方須要使用該對象,就要new一次,在計算機內存中則須要每次都要分配內存空間出來,當使用new的次數增多時,內存空間也隨着消耗加大。Flyweight模式則是經過儘可能共享實例來避免內存的大量消耗。算法

2、Flyweight模式的原理編程

Flyweight類:是一些須要被共享的類;app

FlyweightFactory類:負責生成Flyweight類的工廠類;this

Client類:調用類。spa

3、Flyweight模式實例code

        如今由一些由許多普通字符組合成爲「大型字符」的類,它的實例就是重實例。示例中根據傳遞的數字,輸出對應的文件內容。進行示例以前,要準備一些txt文件。對象

本示例的txt文件內容以下:blog

UML圖:內存

一、BigChar類

package com.cjs.Flyweight; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class BigChar { private final String PATH = "E:\\IntelliJ Idea\\designMode\\src\\main\\resources\\"; private char charName; private String fontdata; public BigChar(char charName) { this.charName = charName; try { BufferedReader reader = new BufferedReader(new FileReader(PATH+"big" + charName + ".txt")); String line; StringBuffer buffer = new StringBuffer(); while ((line = reader.readLine()) != null) { buffer.append(line); buffer.append("\n"); } reader.close(); this.fontdata = buffer.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void print() { System.out.println(fontdata); } }

        BigChar類定義了三個屬性,PATH定義了文件路徑,charName表示將要傳進來的字符,如‘1’,‘2’等等,fontdata用於存儲文件內容,以及輸出。構造方法的做用是:根據傳進來的字符,找到對應的txt文件,而後逐行讀取信息,將信息用StringBuffer對象保存,最後一次性保存在fontdata字符串中。

二、BigCharFactory類

package com.cjs.Flyweight; import java.util.HashMap; public class BigCharFactory { private HashMap pool = new HashMap(); private static BigCharFactory singleton = new BigCharFactory();//使用靜態實現單例模式
 
    private BigCharFactory() { } public static BigCharFactory getInstance() { return singleton; } public synchronized BigChar getBigChar(char charName) { BigChar bigChar = (BigChar) pool.get("" + charName); if (bigChar == null) { bigChar = new BigChar(charName); pool.put("" + charName, bigChar); } return bigChar; } }

        由於BigCharFactory對象是共享的,只須要一個,因此使用了單例模式,另外,該工廠類主要用於生產BigChar對象,因此定義了getBigChar方法,該方法做用是,先根據字符到pool裏面找,是否存在對應的對象,若是存在,直接返回、使用BigChar對象,若是不存在,建立一個新的BigChar對象,並放在pool裏面。pool是一個HashMap類型屬性,使用鍵值對來管理BigChar對象。

三、BigString類

package com.cjs.Flyweight; public class BigString { private BigChar[] bigChars; public BigString(String string) { bigChars = new BigChar[string.length()]; BigCharFactory factory = BigCharFactory.getInstance(); for (int i = 0; i < bigChars.length; i++) { bigChars[i] = factory.getBigChar(string.charAt(i)); } } public void print() { for (int i = 0; i < bigChars.length; i++) { bigChars[i].print(); } } }

        BigString做用是根據傳入的字符串,將其拆分爲單個字符,經過字符獲取對應的BigChar實例對象,逐個輸出。

四、Main類

package com.cjs.Flyweight; public class Main { public static void main(String[] args) { BigString bigString = new BigString("12323"); bigString.print(); } }

輸出結果:

4、總結

        Flyweight模式核心在FlyweightFactory類的getFlyweight()方法的算法,何時建立新對象,如何建立。值得注意的是,Flyweight模式思想是「共享」,換句話說,同一個實例對象,會被多個地方使用,當要改變被共享的對象時,就會有多個地方產生影響。

相關文章
相關標籤/搜索