首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設計模式深度解析:Flyweight 享元模式實戰與 String 內部機制探秘

     編輯:Java 相關知識

模式定義(GoF)

運用共享技術有效支援大量細粒度對象。核心思想:相同對象僅共享一份實例,避免重複創建。

經典場景:文本編輯器字符對象

  • 52 個字母(大小寫)若每次出現都 new 實例,1MB 文本將耗盡記憶體
  • Flyweight 模式:52 個字母對象共享,內部狀態(字符值)不變,外部狀態(位置、字體)由客戶端傳入

完整代碼實作

抽象享元角色

public abstract class Flyweight {
    public abstract void operation();
}

具體享元:內部狀態不可變

public class ConcreteFlyweight extends Flyweight {
    private final String intrinsicState;  // 內部狀態:可共享
    public ConcreteFlyweight(String state) { this.intrinsicState = state; }
    public void operation() {
        System.out.println("Concrete Flyweight: " + intrinsicState);
    }
}

享元工廠:管理對象池

public class FlyweightFactory {
    private final Hashtable flyweights = new Hashtable();  // 對象池

    public Flyweight getFlyweight(Object key) {
        Flyweight fw = (Flyweight) flyweights.get(key);
        if (fw == null) {
            fw = new ConcreteFlyweight((String) key);
            flyweights.put(key, fw);
        }
        return fw;
    }
    public int getSize() { return flyweights.size(); }
}

客戶端使用

FlyweightFactory factory = new FlyweightFactory();
Flyweight f1 = factory.getFlyweight("Google");
Flyweight f2 = factory.getFlyweight("Qutr");
Flyweight f3 = factory.getFlyweight("Google");  // 復用 f1
Flyweight f4 = factory.getFlyweight("Google");
Flyweight f5 = factory.getFlyweight("Google");
Flyweight f6 = factory.getFlyweight("Google");

// 輸出 6 次,但實際對象僅 2 個
System.out.println("objSize = " + factory.getSize());  // 2
Flyweight UML 類圖

Java String 的享元機制

String a = "hello";
String b = "hello";
System.out.println(a == b);  // true!比較的是引用地址

字面量字串編譯期進入常量池,相同值共享同一實例。這是 JVM 級別的 Flyweight 實現。

關鍵區別:內部狀態 vs 外部狀態

適用場景與效益

  • 系統中存在大量相似對象
  • 對象可拆分為內部/外部狀態
  • 外部狀態可外部化管理
  • 效益:大幅降低記憶體佔用、提升 GC 效能、加快對象創建速度

注意事項

  • 引入工廠管理增加複雜度
  • 需區分內外部狀態,設計不當反增負擔
  • 線程安全:對象池需同步控制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型特徵存儲位置
內部狀態可共享、不隨環境變化享元對象內部
外部狀態隨環境變化、不可共享客戶端管理,調用時傳入