详解设计模式:享元模式
享元模式(Flyweight Pattern),是對象池的一種體現(xiàn),也是 GoF 的 23 種設(shè)計模式中的一種結(jié)構(gòu)型設(shè)計模式。
享元模式 主要用于減少創(chuàng)建對象的數(shù)量,以減少內(nèi)存占用和提高性能。它提供了減少對象數(shù)量從而改善應用所需的對象結(jié)構(gòu)的方式。
享元模式 嘗試重用現(xiàn)有的同類對象,如果未找到匹配的對象,則創(chuàng)建新對象。
~
本篇內(nèi)容包括:關(guān)于享元模式、享元模式 Demo
文章目錄
- 一、關(guān)于享元模式
- 1、關(guān)于享元模式
- 2、關(guān)于享元模式的構(gòu)成
- 3、關(guān)于享元模式的XML
- 4、關(guān)于享元模式的應用場景
- 5、關(guān)于享元模式在 Java 中的應用
- 6、關(guān)于享元模式的優(yōu)缺點
 
 
- 二、享元模式 Demo
- 1、Demo 設(shè)計
- 2、Demo 實現(xiàn)
 
 
 
一、關(guān)于享元模式
1、關(guān)于享元模式
享元模式(Flyweight Pattern),是對象池的一種體現(xiàn),也是 GoF 的 23 種設(shè)計模式中的一種結(jié)構(gòu)型設(shè)計模式。
享元模式 主要用于減少創(chuàng)建對象的數(shù)量,以減少內(nèi)存占用和提高性能。它提供了減少對象數(shù)量從而改善應用所需的對象結(jié)構(gòu)的方式。
享元模式 嘗試重用現(xiàn)有的同類對象,如果未找到匹配的對象,則創(chuàng)建新對象。
2、關(guān)于享元模式的構(gòu)成
享元模式主要包含四種角色:
3、關(guān)于享元模式的XML
4、關(guān)于享元模式的應用場景
當系統(tǒng)中多處需要同一組信息時,可以吧這些信息封裝到一個對象中,然后對該對象進行緩存,這樣,一個對象就可以提供給多處需要使用的地方,避免大量同一對象多次創(chuàng)建,消耗大量內(nèi)存空間。
 享元模式其實就是工廠模式的一個改進機制,享元模式同樣要求創(chuàng)建一個或一組對象,并且就是通過工廠方法生成對象的,只不過享元模式中為工廠方法增加了緩存這一功能。主要總結(jié)為以下應用場景:
在生活中的享元模式也很常見,比如中介機構(gòu)的房源共享,再比如全國社保聯(lián)網(wǎng)。
5、關(guān)于享元模式在 Java 中的應用
在 Java 中最直觀的享元模式就是在 Boolean,Byte,Integer,Long,Character 這些包裝類中,他們都提供了valueOf()方法。
比如:Long 的 valueOf() 方法會緩存數(shù)值 -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 之間,最小值不能改變,但是最大值可以通過虛擬機參數(shù)進行改變。-Djava.long.Intger.IntegerCache.high 來改變
Boolean 緩存了 TRUE 和 FALSE
6、關(guān)于享元模式的優(yōu)缺點
# 享元模式的優(yōu)點:
# 享元模式的缺點:
二、享元模式 Demo
1、Demo 設(shè)計
俄羅斯方塊有不同的形狀,我們可以對這些形狀向上抽取出 AbstractBox,用來定義共性的屬性和行為。
接下來就是定義不同的形狀了,IBox類、LBox類、TBox類等。
提供了一個工廠類(BoxFactory),用來管理享元對象(也就是 AbstractBox 子類對象),該工廠類對象只需要一個,所以可以使用單例模式。并給工廠類提供一個獲取形狀的方法。
2、Demo 實現(xiàn)
# 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);} }總結(jié)
以上是生活随笔為你收集整理的详解设计模式:享元模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: B+树索引及其使用
- 下一篇: 物联网卡设置_物联卡中心:物联网卡这样设
