Java設計模式之享元模式(Flyweight Pattern)詳解
享元模式概念
享元模式(Flyweight Pattern)是一種結構型設計模式,旨在減少對象的數(shù)量,以節(jié)省內(nèi)存空間和提高性能。它通過共享相同或相似狀態(tài)的多個對象來減少對象的數(shù)量。享元模式通常用于大量創(chuàng)建細粒度對象的場景。
享元模式使用場景
在享元模式中,我們創(chuàng)建一個工廠類(Flyweight Factory),該工廠類對外提供獲取享元對象的方法。享元對象包含兩部分屬性:內(nèi)部狀態(tài)(Intrinsic State)和外部狀態(tài)(Extrinsic State)。內(nèi)部狀態(tài)指不隨外界環(huán)境改變而改變的共享部分,外部狀態(tài)指隨著環(huán)境的改變而改變的部分。
當客戶端需要一個享元對象時,它向工廠類請求一個對象,工廠類會首先查詢對象池中是否已經(jīng)有該對象的實例。如果有,就直接返回對象池中的實例;如果沒有,則創(chuàng)建一個新的實例并將其放入對象池中,同時返回給客戶端。
享元模式優(yōu)缺點
享元模式的優(yōu)點在于,它可以大大減少系統(tǒng)中對象的數(shù)量,從而提高系統(tǒng)的性能和內(nèi)存利用率。它也可以使得代碼更加簡潔,易于維護和擴展。
但是,享元模式也有一些缺點,在某些情況下,它可能會犧牲部分內(nèi)存以換取性能的提升。同時,由于享元對象通常是不可變的對象,因此可能會對系統(tǒng)中的某些業(yè)務邏輯造成影響。
享元模式代碼案例
下面以一個具體例子,比如制作黑白棋游戲來進一步說明:
對于黑白棋這個游戲來說,我們需要大量的棋子對象,如果為每一個棋子都單獨創(chuàng)建一個對象,那么系統(tǒng)的性能和內(nèi)存開銷都會非常大。而使用享元模式,我們可以將一些相同的棋子對象共享起來,只需要保存其內(nèi)部和外部狀態(tài)區(qū)分即可。例如,黑方和白方用不同顏色的棋子,但同一顏色的棋子之間是可以互相替換的。
定義棋子類Piece
public interface Piece {
void put(int x, int y);
}
public class BlackPiece implements Piece {
@Override
public void put(int x, int y) {
System.out.println("在坐標 (" + x + ", " + y + ") 放置了一個黑棋子");
}
}
public class WhitePiece implements Piece {
@Override
public void put(int x, int y) {
System.out.println("在坐標 (" + x + ", " + y + ") 放置了一個白棋子");
}
}以上代碼實現(xiàn)了兩個具體的棋子類:BlackPiece 和 WhitePiece。它們都實現(xiàn)了 Piece 接口,并重寫了其中的 put() 方法,用于在指定坐標放棋子。
實現(xiàn)享元工廠類PieceFactory
import java.util.HashMap;
import java.util.Map;
public class PieceFactory {
private final Map<String, Piece> map = new HashMap<>();
public Piece getPiece(String color) {
Piece piece = map.get(color);
if (piece == null) {
switch (color) {
case "black":
piece = new BlackPiece();
break;
case "white":
piece = new WhitePiece();
break;
default:
throw new IllegalArgumentException("Unsupported color: " + color);
}
map.put(color, piece);
}
return piece;
}
}以上代碼實現(xiàn)了一個操作棋子對象的共享工廠PieceFactory,其中使用了HashMap來保存已經(jīng)創(chuàng)建過的棋子對象。直接調用getPiece()方法即可根據(jù)顏色獲取相應的棋子對象。如果該顏色的棋子對象不存在,則創(chuàng)建一個新的棋子對象并存入map中,否則直接從map中獲取棋子對象。
在客戶端中使用享元模式
public class Client {
public static void main(String[] args) {
PieceFactory factory = new PieceFactory();
Piece black1 = factory.getPiece("black");
black1.put(1, 1);
Piece black2 = factory.getPiece("black");
black2.put(2, 2);
Piece white1 = factory.getPiece("white");
white1.put(3, 3);
Piece white2 = factory.getPiece("white");
white2.put(4, 4);
}
}在上面的代碼中,我們可以看到一個完整的享元模式實現(xiàn)。在客戶端中,我們只需要獲取工廠類中提供的共享對象即可,通過調用 put() 方法來為棋子設置坐標。
通過以上例子,我們可以看出享元模式的優(yōu)點:它大幅度減少內(nèi)存占用并提高了系統(tǒng)性能,對于類似的大量重復對象的場景非常友好。
到此這篇關于Java設計模式之享元模式(Flyweight Pattern)詳解的文章就介紹到這了,更多相關Java 享元模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用SpringSecurity+defaultSuccessUrl不跳轉指定頁面的問題解決方法
本人是用springsecurity的新手,今天遇到defaultSuccessUrl不跳轉指定頁面的問題,真是頭疼死了,網(wǎng)上找遍了解決方法都解決不了,今天給大家分享使用SpringSecurity+defaultSuccessUrl不跳轉指定頁面的問題解決方法,感興趣的朋友一起看看吧2023-12-12
從Myeclipse 導入到eclipse中無法識別為 web項目 問題的解決步驟
這篇文章主要介紹了從Myeclipse 導入到eclipse中無法識別為 web項目 問題的解決步驟,需要的朋友可以參考下2018-05-05
SpringBoot+Jersey跨域文件上傳的實現(xiàn)示例
在SpringBoot開發(fā)后端服務時,我們一般是提供接口給前端使用,本文主要介紹了SpringBoot+Jersey跨域文件上傳的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-07-07
win7 64位系統(tǒng)JDK安裝配置環(huán)境變量教程
這篇文章主要為大家詳細介紹了win7 64位系統(tǒng)JDK安裝配置環(huán)境變量教程,感興趣的小伙伴們可以參考一下2016-06-06
SpringBoot快速接入DeepSeek?api(帶頁面)保姆級教程
這篇文章主要介紹了如何在Java端接入DeepSeek?API,包括申請APIkey、項目結構展示、編寫controller和前端界面、以及測試啟動項目的過程,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-03-03

