享元模式(FlyWeight)
享元模式使用場景:
內(nèi)存屬于稀缺資源,不要隨便浪費(fèi)。如果有很多個(gè)完全相同或相似的對(duì)象,我們可以用通過享元模式,節(jié)省內(nèi)存。
享元模式的核心:?
享元模式以共享的方式高效的支持大量細(xì)粒度對(duì)象的重用。?
享元對(duì)象能做到共享的關(guān)鍵是區(qū)分了內(nèi)部狀態(tài)和外部狀態(tài)。內(nèi)部狀態(tài):可以共享,不會(huì)隨環(huán)境變化而改變;外部狀態(tài):不可以共享,會(huì)隨環(huán)境變化而改變。
享元模式的實(shí)現(xiàn):?
FlyWeight享元工廠類:創(chuàng)建并管理享元對(duì)象,享元池一般設(shè)計(jì)成鍵值對(duì);?
FlyWeight抽象享元類:通常是一個(gè)接口或者抽象類,聲明公共方法,這些方法可以向外界提供對(duì)象的內(nèi)部狀態(tài),設(shè)置外部狀態(tài);
ConcreteFlyWeight具體享元類:為內(nèi)部狀態(tài)提供成員變量進(jìn)行存儲(chǔ);?
UnsharedConcreteFlyWeight非共享享元類:不能被共享的子類可以設(shè)計(jì)為非共享享元類。
?
下面通過棋子的例子代碼來解釋:?
首先,創(chuàng)建棋子的坐標(biāo)類,由于不同棋子坐標(biāo)不同,是不能共享的,所以該類是UnSharedConcreteFlyWeight:
package com.note.pattern.flyweight;public class Coordinate {private int x,y;public Coordinate(int x, int y) {super();this.x = x;this.y = y;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}}
創(chuàng)建抽象享元類FlyWeight和具體享元類ConcreteFlyWeight
package com.note.pattern.flyweight;public interface ChessFlyWeight {String getColor();void display(Coordinate c);}class ConcreteChess implements ChessFlyWeight {private String color;public ConcreteChess(String color) {super();this.color = color;}@Overridepublic String getColor() {return color;}@Overridepublic void display(Coordinate c) {System.out.println("棋子顏色:" + color);System.out.println("棋子位置:" + c.getX() + "----" + c.getY());}}
創(chuàng)建享元工廠類:
package com.note.pattern.flyweight;import java.util.HashMap; import java.util.Map;public class ChessFlyWeightFactory {private static Map<String, ChessFlyWeight> map = new HashMap<>();public static ChessFlyWeight getChess(String color) {if(map.get(color) != null) {return map.get(color);}else {ChessFlyWeight chess = new ConcreteChess(color);map.put(color, chess);return chess;}}}客戶端測試:
package com.note.pattern.flyweight;public class Client {public static void main(String[] args) {ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess("黑色");ChessFlyWeight chess2 = ChessFlyWeightFactory.getChess("黑色");System.out.println(chess1);System.out.println(chess2);System.out.println("增加外部狀態(tài)的處理===========");chess1.display(new Coordinate(10, 10));chess2.display(new Coordinate(20, 20));}}
運(yùn)行結(jié)果
com.note.pattern.flyweight.ConcreteChess@7852e922 com.note.pattern.flyweight.ConcreteChess@7852e922 增加外部狀態(tài)的處理=========== 棋子顏色:黑色 棋子位置:10----10 棋子顏色:黑色 棋子位置:20----20
可以發(fā)現(xiàn),chess1和chess2兩個(gè)棋子屬于同一個(gè)對(duì)象,它們的顏色屬性屬于內(nèi)部狀態(tài),實(shí)現(xiàn)了共享,但是它們的坐標(biāo)屬性屬于外部狀態(tài),沒有實(shí)現(xiàn)共享,并不相同。這樣節(jié)省了內(nèi)存空間。
享元模式在開發(fā)中應(yīng)用場景:?
享元模式由于其共享的特性,可以在任何“池”中操作,比如線程池,數(shù)據(jù)庫連接池;?
String類的設(shè)計(jì)也是享元模式
享元模式的優(yōu)缺點(diǎn):?
優(yōu)點(diǎn):?
極大地減少了內(nèi)存中對(duì)象的數(shù)量;?
相同或相似對(duì)象內(nèi)存中只存一份,極大地節(jié)約了資源,提高系統(tǒng)性能;?
外部狀態(tài)相對(duì)獨(dú)立,不影響內(nèi)部狀態(tài);?
缺點(diǎn):?
模式較為復(fù)雜,使程序邏輯復(fù)雜化;?
為了節(jié)省內(nèi)存,共享了內(nèi)部狀態(tài),分離出外部狀態(tài),而讀取外部狀態(tài)使運(yùn)行時(shí)間變長,用時(shí)間換取了空間。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhaojianhua/p/8257497.html
總結(jié)
以上是生活随笔為你收集整理的享元模式(FlyWeight)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二阶段团队每日冲刺07
- 下一篇: 冲刺2 3