岳陽(yáng)網(wǎng)站設(shè)計(jì)改版電子商務(wù)seo
1 享元模式介紹
2 享元模式原理
3 享元模式實(shí)現(xiàn)
抽象享元類可以是一個(gè)接口也可以是一個(gè)抽象類,作為所有享元類的公共父類, 主要作用是提高系統(tǒng)的可擴(kuò)展性.
//* 抽象享元類
public abstract class Flyweight {public abstract void operation(String extrinsicState);
}
具體享元類
具體享元類中要將內(nèi)部狀態(tài)和外部狀態(tài)分開(kāi)處理,內(nèi)部狀態(tài)作為具體享元類的成員變量,而外部狀態(tài)通過(guò)注入的方式添加到具體享元類中.
/*** 可共享的-具體享元類* 注意: 在具體享元類中,需要將內(nèi)部狀態(tài)和外部狀態(tài)分開(kāi)處理.**/
public class ConcreteFlyweight extends Flyweight{//內(nèi)部狀態(tài) : inState作為一個(gè)成員變量,同一個(gè)享元對(duì)象的內(nèi)部狀態(tài)是一致的.private String inState;public ConcreteFlyweight(String inState) {this.inState = inState;}/*** 外部狀態(tài)在使用的時(shí)候,通常是有外部設(shè)置,不保存在享元對(duì)象中,即使是同一個(gè)對(duì)象* @param state*/@Overridepublic void operation(String state) {System.out.println("=== 享元對(duì)象的內(nèi)部狀態(tài): " + inState + ",外部狀態(tài): " + state );}
}
非共享享元類,不復(fù)用享元工廠內(nèi)部狀態(tài),但是是抽象享元類的子類或?qū)崿F(xiàn)類
/*** 非共享的具體享元類**/
public class UnsharedFlyweight extends Flyweight{private String inState;public UnsharedFlyweight(String inState) {this.inState = inState;}@Overridepublic void operation(String state) {System.out.println("=== 使用不共享對(duì)象,內(nèi)部狀態(tài): " + inState + ",外部狀態(tài): " + state );}
}
享元工廠類, 管理一個(gè)享元對(duì)象類的緩存池。它會(huì)存儲(chǔ)享元對(duì)象之間需要傳遞的共有狀態(tài),比如,按照大寫(xiě)英文字母來(lái)作為狀態(tài)標(biāo)識(shí),這種只在享元對(duì)象之間傳遞的方式就叫內(nèi)部狀態(tài)。同時(shí),它還提供了一個(gè)通用方法getFlyweight(),主要通過(guò)內(nèi)部狀態(tài)標(biāo)識(shí)來(lái)獲取享元對(duì)象。
/*** 享元工廠類* 作用: 作為存儲(chǔ)享元對(duì)象的享元池.用戶獲取享元對(duì)象時(shí)先從享元池中獲取,有則返回,沒(méi)有創(chuàng)建新的返回給用戶,* 并且在享元池中保存**/
public class FlyweightFactory {//定義一個(gè)Map集合用于存儲(chǔ)享元對(duì)象,實(shí)現(xiàn)享元池private Map<String,Flyweight> pool = new HashMap<>();//實(shí)現(xiàn)享元對(duì)象之間的狀態(tài)傳遞public FlyweightFactory() {//添加對(duì)應(yīng)的內(nèi)部狀態(tài)pool.put("A",new ConcreteFlyweight("A"));pool.put("B",new ConcreteFlyweight("B"));pool.put("C",new ConcreteFlyweight("C"));}//根據(jù)內(nèi)部狀態(tài)進(jìn)行查找public Flyweight getFlyweight(String key){//對(duì)象是否存在if(pool.containsKey(key)){System.out.println("=== 享元池中存在,直接復(fù)用,key : " + key);return pool.get(key);}else{//如果對(duì)象不存在,就創(chuàng)建一個(gè)添加到享元池,然后返回System.out.println("=== 享元池中不存在,創(chuàng)建并復(fù)用,key: " + key);Flyweight fw = new ConcreteFlyweight(key);pool.put(key,fw);return fw;}}
}
public class Client {public static void main(String[] args) {//獲取工廠對(duì)象FlyweightFactory factory = new FlyweightFactory();//通過(guò)工廠對(duì)象獲取共享的享元對(duì)象Flyweight a1 = factory.getFlyweight("A");a1.operation("a1ExState");Flyweight a2 = factory.getFlyweight("A");a2.operation("a2ExState");System.out.println(a1 == a2);//獲取非共享的享元對(duì)象UnsharedFlyweight u1 = new UnsharedFlyweight("A");UnsharedFlyweight u2 = new UnsharedFlyweight("A");System.out.println(u1 == u2);}
}
4 享元模式應(yīng)用實(shí)例
/*** 抽象享元類: 五子棋**/
public abstract class GobangFlyweight {public abstract String getColor();public void display(){System.out.println("棋子顏色: " + this.getColor());}
}
/*** 共享享元類-白色棋子**/
public class WriteGobang extends GobangFlyweight {@Overridepublic String getColor() {return "白色";}
}
/*** 共享享元類-黑色棋子**/
public class BlackGobang extends GobangFlyweight {@Overridepublic String getColor() {return "黑色";}
}
/*** 享元工廠類-生產(chǎn)五子棋棋子**/
public class GobangFactory {//享元池private static Map<String,GobangFlyweight> pool;//創(chuàng)建共享享元對(duì)象,設(shè)置對(duì)象的內(nèi)部狀態(tài)private GobangFactory() {pool = new HashMap<>();GobangFlyweight black = new BlackGobang(); //黑子GobangFlyweight write = new WriteGobang(); //白子pool.put("b",black);pool.put("w",write);}//獲取唯一享元工廠對(duì)象的方法public static GobangFactory getInstance(){return SingletonHolder.INSTANCE;}//靜態(tài)內(nèi)部類private static class SingletonHolder{private static final GobangFactory INSTANCE = new GobangFactory();}//通過(guò)key獲取集合中的享元對(duì)象public GobangFlyweight getGobang(String key){return pool.get(key);}}
public class Client {public static void main(String[] args) {GobangFactory instance = GobangFactory.getInstance();//獲取3顆黑子GobangFlyweight b1 = instance.getGobang("b");GobangFlyweight b2 = instance.getGobang("b");GobangFlyweight b3 = instance.getGobang("b");System.out.println("判斷黑子是否是同一對(duì)象: " + (b1 == b2));GobangFlyweight w1 = instance.getGobang("w");GobangFlyweight w2 = instance.getGobang("w");System.out.println("判斷白子是否是同一對(duì)象: " + (w1 == w2));//顯示棋子b1.display();b2.display();b3.display();w1.display();w2.display();}
}
5 享元模式總結(jié)