详解设计模式:享元模式
享元模式(Flyweight Pattern),是對象池的一種體現,也是 GoF 的 23 種設計模式中的一種結構型設計模式。
享元模式 主要用于減少創建對象的數量,以減少內存占用和提高性能。它提供了減少對象數量從而改善應用所需的對象結構的方式。
享元模式 嘗試重用現有的同類對象,如果未找到匹配的對象,則創建新對象。
~
本篇內容包括:關于享元模式、享元模式 Demo
文章目錄
- 一、關于享元模式
- 1、關于享元模式
- 2、關于享元模式的構成
- 3、關于享元模式的XML
- 4、關于享元模式的應用場景
- 5、關于享元模式在 Java 中的應用
- 6、關于享元模式的優缺點
- 二、享元模式 Demo
- 1、Demo 設計
- 2、Demo 實現
一、關于享元模式
1、關于享元模式
享元模式(Flyweight Pattern),是對象池的一種體現,也是 GoF 的 23 種設計模式中的一種結構型設計模式。
享元模式 主要用于減少創建對象的數量,以減少內存占用和提高性能。它提供了減少對象數量從而改善應用所需的對象結構的方式。
享元模式 嘗試重用現有的同類對象,如果未找到匹配的對象,則創建新對象。
2、關于享元模式的構成
享元模式主要包含四種角色:
3、關于享元模式的XML
4、關于享元模式的應用場景
當系統中多處需要同一組信息時,可以吧這些信息封裝到一個對象中,然后對該對象進行緩存,這樣,一個對象就可以提供給多處需要使用的地方,避免大量同一對象多次創建,消耗大量內存空間。
享元模式其實就是工廠模式的一個改進機制,享元模式同樣要求創建一個或一組對象,并且就是通過工廠方法生成對象的,只不過享元模式中為工廠方法增加了緩存這一功能。主要總結為以下應用場景:
在生活中的享元模式也很常見,比如中介機構的房源共享,再比如全國社保聯網。
5、關于享元模式在 Java 中的應用
在 Java 中最直觀的享元模式就是在 Boolean,Byte,Integer,Long,Character 這些包裝類中,他們都提供了valueOf()方法。
比如:Long 的 valueOf() 方法會緩存數值 -127~128 之間的 Long 對象,在這個范圍之間就會直接在這個里面去取,大于這個范圍才會去 new Long 對象
public static Long valueOf(long l) {final int offset = 128;if (l >= -128 && l <= 127) { // will cachereturn LongCache.cache[(int)l + offset];}return new Long(l);}private static class LongCache {private LongCache(){}static final Long cache[] = new Long[-(-128) + 127 + 1];static {for(int i = 0; i < cache.length; i++)cache[i] = new Long(i - 128);}}Byte,Short,Long 的范圍是 -127~128 之間。
Character 是 0~127 之間。
Integer 是 -127~128 之間,最小值不能改變,但是最大值可以通過虛擬機參數進行改變。-Djava.long.Intger.IntegerCache.high 來改變
Boolean 緩存了 TRUE 和 FALSE
6、關于享元模式的優缺點
# 享元模式的優點:
# 享元模式的缺點:
二、享元模式 Demo
1、Demo 設計
俄羅斯方塊有不同的形狀,我們可以對這些形狀向上抽取出 AbstractBox,用來定義共性的屬性和行為。
接下來就是定義不同的形狀了,IBox類、LBox類、TBox類等。
提供了一個工廠類(BoxFactory),用來管理享元對象(也就是 AbstractBox 子類對象),該工廠類對象只需要一個,所以可以使用單例模式。并給工廠類提供一個獲取形狀的方法。
2、Demo 實現
# AbstractBox 抽象享元角色
public abstract class AbstractBox {public abstract String getShape();public void display(String color) {System.out.println("方塊形狀:" + this.getShape() + " 顏色:" + color);} }# IBox/LBox/TBox 具體享元角色
public class IBox extends AbstractBox {@Overridepublic String getShape() {return "I";} }public class LBox extends AbstractBox {@Overridepublic String getShape() {return "L";} }public class TBox extends AbstractBox {@Overridepublic String getShape() {return "T";} }# BoxFactory 享元工廠
public class BoxFactory {private static HashMap<String, AbstractBox> map;private BoxFactory() {map = new HashMap<String, AbstractBox>();AbstractBox iBox = new IBox();AbstractBox lBox = new LBox();AbstractBox oBox = new OBox();map.put("I", iBox);map.put("L", lBox);map.put("O", oBox);}public static final BoxFactory getInstance() {return SingletonHolder.INSTANCE;}private static class SingletonHolder {private static final BoxFactory INSTANCE = new BoxFactory();}public AbstractBox getBox(String key) {return map.get(key);} }總結
以上是生活随笔為你收集整理的详解设计模式:享元模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: B+树索引及其使用
- 下一篇: 设计模式的征途—16.访问者(Visit