日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

享元模式(FlyWeight)

發(fā)布時(shí)間:2025/4/16 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 享元模式(FlyWeight) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

享元模式使用場(chǎng)景:

  內(nèi)存屬于稀缺資源,不要隨便浪費(fèi)。如果有很多個(gè)完全相同或相似的對(duì)象,我們可以用通過(guò)享元模式,節(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享元工廠類(lèi):創(chuàng)建并管理享元對(duì)象,享元池一般設(shè)計(jì)成鍵值對(duì);?

  FlyWeight抽象享元類(lèi):通常是一個(gè)接口或者抽象類(lèi),聲明公共方法,這些方法可以向外界提供對(duì)象的內(nèi)部狀態(tài),設(shè)置外部狀態(tài);

  ConcreteFlyWeight具體享元類(lèi):為內(nèi)部狀態(tài)提供成員變量進(jìn)行存儲(chǔ);?

  UnsharedConcreteFlyWeight非共享享元類(lèi):不能被共享的子類(lèi)可以設(shè)計(jì)為非共享享元類(lèi)。

?

  下面通過(guò)棋子的例子代碼來(lái)解釋:?

  首先,創(chuàng)建棋子的坐標(biāo)類(lèi),由于不同棋子坐標(biāo)不同,是不能共享的,所以該類(lèi)是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)建抽象享元類(lèi)FlyWeight和具體享元類(lèi)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)建享元工廠類(lèi):

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;}}}

  客戶(hù)端測(cè)試:

  

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),沒(méi)有實(shí)現(xiàn)共享,并不相同。這樣節(jié)省了內(nèi)存空間。

  

享元模式在開(kāi)發(fā)中應(yīng)用場(chǎng)景:?

  享元模式由于其共享的特性,可以在任何“池”中操作,比如線(xiàn)程池,數(shù)據(jù)庫(kù)連接池;?
  String類(lèi)的設(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í)間變長(zhǎng),用時(shí)間換取了空間。

?

轉(zhuǎn)載于:https://www.cnblogs.com/zhaojianhua/p/8257497.html

總結(jié)

以上是生活随笔為你收集整理的享元模式(FlyWeight)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。