更新時間:2021-08-19 來源:黑馬程序員 瀏覽量:
運用共享技術(shù)來有效地支持大量細粒度對象的復用。它通過共享已經(jīng)存在的對象來大幅度減少需要創(chuàng)建的對象數(shù)量、避免大量相似對象的開銷,從而提高系統(tǒng)資源的利用率。
享元(Flyweight )模式中存在以下兩種狀態(tài):
內(nèi)部狀態(tài),即不會隨著環(huán)境的改變而改變的可共享部分。
外部狀態(tài),指隨環(huán)境改變而改變的不可以共享的部分。享元模式的實現(xiàn)要領(lǐng)就是區(qū)分應用中的這兩種狀態(tài),并將外部狀態(tài)外部化。
享元模式的主要有以下角色:
抽象享元角色(Flyweight):通常是一個接口或抽象類,在抽象享元類中聲明了具體享元類公共的方法,這些方法可以向外界提供享元對象的內(nèi)部數(shù)據(jù)(內(nèi)部狀態(tài)),同時也可以通過這些方法來設(shè)置外部數(shù)據(jù)(外部狀態(tài))。
具體享元(Concrete Flyweight)角色 :它實現(xiàn)了抽象享元類,稱為享元對象;在具體享元類中為內(nèi)部狀態(tài)提供了存儲空間。通常我們可以結(jié)合單例模式來設(shè)計具體享元類,為每一個具體享元類提供唯一的享元對象。
非享元(Unsharable Flyweight)角色 :并不是所有的抽象享元類的子類都需要被共享,不能被共享的子類可設(shè)計為非共享具體享元類;當需要一個非共享具體享元類的對象時可以直接通過實例化創(chuàng)建。
享元工廠(Flyweight Factory)角色 :負責創(chuàng)建和管理享元角色。當客戶對象請求一個享元對象時,享元工廠檢査系統(tǒng)中是否存在符合要求的享元對象,如果存在則提供給客戶;如果不存在的話,則創(chuàng)建一個新的享元對象。
用享元模式實現(xiàn)俄羅斯方塊游戲功能案例
下面的圖片是眾所周知的俄羅斯方塊中的一個個方塊,如果在俄羅斯方塊這個游戲中,每個不同的方塊都是一個實例對象,這些對象就要占用很多的內(nèi)存空間,下面利用享元模式進行實現(xiàn)。
先來看類圖:
代碼如下:
俄羅斯方塊有不同的形狀,我們可以對這些形狀向上抽取出AbstractBox,用來定義共性的屬性和行為。
public abstract class AbstractBox { public abstract String getShape(); public void display(String color) { System.out.println("方塊形狀:" + this.getShape() + " 顏色:" + color); } }
接下來就是定義不同的形狀了,IBox類、LBox類、OBox類等。
public class IBox extends AbstractBox { @Override public String getShape() { return "I"; } } public class LBox extends AbstractBox { @Override public String getShape() { return "L"; } } public class OBox extends AbstractBox { @Override public String getShape() { return "O"; } }
提供了一個工廠類(BoxFactory),用來管理享元對象(也就是AbstractBox子類對象),該工廠類對象只需要一個,所以可以使用單例模式。并給工廠類提供一個獲取形狀的方法。
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); } }
if結(jié)構(gòu)語句的格式有幾種?應該怎樣執(zhí)行操作?