<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      「全網(wǎng)最細(xì) + 實戰(zhàn)源碼案例」設(shè)計模式——享元模式

      ?

      核心思想

      • 享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計模式,主要用于減少程序中大量對象的內(nèi)存消耗。該模式通過共享相同的數(shù)據(jù)來有效減少內(nèi)存的使用,適用于對象非常多且可以共享一部分狀態(tài)的場景。
      • 核心:將對象的內(nèi)部狀態(tài)外部狀態(tài)分離
        • 內(nèi)部狀態(tài):存儲在享元對象內(nèi)部的、不會改變的狀態(tài),通常是可以共享的。
        • 外部狀態(tài):依賴于環(huán)境且變化的狀態(tài),不可共享。

      ?

      編輯


      結(jié)構(gòu)

      1. Flyweight(享元角色)

      • 聲明享元對象的接口,通常是不可變的。

      2. ConcretFlyweight(具體享元角色)

      • 實現(xiàn) Flyweight 接口,存儲共享狀態(tài)。

      3. UnsharedConcreteFlyweight(非共享具體享元角色)

      • 非共享的享元對象,一般不是由享元工廠創(chuàng)建。

      4. FlyweightFactory(享元工廠)

      • 用來管理享元對象的工廠類,確保共享對象的唯一性。

      ?

      編輯


      適用場景

      1. 存在大量相似對象
      2. 對象狀態(tài)可分為內(nèi)部、外部狀態(tài)。
      3. 節(jié)省內(nèi)存,避免重復(fù)創(chuàng)建對象。

      優(yōu)缺點

      優(yōu)點:

      1. 節(jié)省內(nèi)存:避免重復(fù)創(chuàng)建相似對象。
      2. 提高性能:減少重復(fù)創(chuàng)建對象的開銷。

      缺點:

      1. 增加復(fù)雜性:享元模式、工廠類的設(shè)計。

      實現(xiàn)步驟

      1. 將需要改寫為享元的類成員變量拆分為兩個部分:
        1. 內(nèi)在狀態(tài): 包含不變的、 可在許多對象中重復(fù)使用的數(shù)據(jù)的成員變量。
        2. 外在狀態(tài): 包含每個對象各自不同的情景數(shù)據(jù)的成員變量
      1. 保留類中表示內(nèi)在狀態(tài)的成員變量, 并將其屬性設(shè)置為不可修改。 這些變量僅可在構(gòu)造函數(shù)中獲得初始數(shù)值。
      2. 找到所有使用外在狀態(tài)成員變量的方法, 為在方法中所用的每個成員變量新建一個參數(shù), 并使用該參數(shù)代替成員變量。
      3. 你可以有選擇地創(chuàng)建工廠類來管理享元緩存池, 它負(fù)責(zé)在新建享元時檢查已有的享元。 如果選擇使用工廠, 客戶端就只能通過工廠來請求享元, 它們需要將享元的內(nèi)在狀態(tài)作為參數(shù)傳遞給工廠。
      4. 客戶端必須存儲和計算外在狀態(tài) (情景) 的數(shù)值, 因為只有這樣才能調(diào)用享元對象的方法。 為了使用方便, 外在狀態(tài)和引用享元的成員變量可以移動到單獨的情景類中。

      示例

      ?

      編輯

      ?

      編輯

      // 享元角色
      public abstract class AbstractBox {
      
          // 獲取圖形
          public abstract String getShape();
      
          // 顯示圖形及顏色
          public void display(String color){
              System.out.println("方塊:" + getShape() + ",顏色:" + color);
          }
      }
      
      // 具體享元角色——I
      public class IBox extends AbstractBox{
          @Override
          public String getShape() {
              return "I";
          }
      }
      
      // 具體享元角色——L
      public class LBox extends AbstractBox{
          @Override
          public String getShape() {
              return "L";
          }
      }
      
      // 具體享元角色——O
      public class OBox extends AbstractBox{
          @Override
          public String getShape() {
              return "O";
          }
      }
      
      // 享元工廠(靜態(tài)內(nèi)部類單例方式)
      public class BoxFactory {
      
          // 享元對象池
          private Map<String, AbstractBox> boxes;
      
          // 私有化構(gòu)造器
          private BoxFactory() {
              boxes = new HashMap<>();
              boxes.put("L", new LBox());
              boxes.put("I", new IBox());
              boxes.put("O", new OBox());
          }
      
          // 獲取享元對象
          public AbstractBox getBox(String type) {
              return boxes.get(type);
          }
      
          // 創(chuàng)建靜態(tài)內(nèi)部類
          private static class SingletonHolder {
              private static final BoxFactory INSTANCE = new BoxFactory();
          }
      
          // 獲取享元工廠實例
          public static BoxFactory getInstance() {
              return SingletonHolder.INSTANCE;
          }
      }
      
      // 客戶端
      public class Client {
          public static void main(String[] args) {
      
              // 1.獲取享元工廠
              BoxFactory boxFactory = BoxFactory.getInstance();
      
              // 2.獲取享元對象
              AbstractBox box1 = boxFactory.getBox("L");
              AbstractBox box2 = boxFactory.getBox("I");
              AbstractBox box3 = boxFactory.getBox("O");
              AbstractBox box4 = boxFactory.getBox("O");
      
              // 3.獲取非享元對象并顯示
              box1.display("red");
              box2.display("blue");
              box3.display("green");
              box4.display("yellow");
      
              // 4.驗證享元對象是否共享
              System.out.println(box3 == box4);
      
          }
      }
      


      在源碼中的應(yīng)用

      ?

      編輯

      ?

      編輯

      ?

      編輯

      ?

      編輯


      與其他模式的關(guān)系

      • 你可以使用享元模式實現(xiàn)組合模式樹的共享葉節(jié)點以節(jié)省內(nèi)存。
      • 享元展示了如何生成大量的小型對象, 外觀模式則展示了如何用一個對象來代表整個子系統(tǒng)。
      • 如果你能將對象的所有共享狀態(tài)簡化為一個享元對象, 那么享元就和單例模式類似了。 但這兩個模式有兩個根本性的不同。
        • 只會有一個單例實體, 但是享元類可以有多個實體, 各實體的內(nèi)在狀態(tài)也可以不同。
        • 單例對象可以是可變的。 享元對象是不可變的。

      ?

      posted @ 2025-02-02 17:38  SlackClimb  閱讀(54)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 在线a亚洲v天堂网2018| 国产成人精品亚洲日本语言| 亚洲午夜福利精品无码不卡| 亚洲国产午夜精品理论片| 视频一区二区不中文字幕| 男女真人国产牲交a做片野外| 国产精品久久蜜臀av| 人妻中文字幕av资源站| 91福利国产午夜亚洲精品| 国产日韩入口一区二区| 国产香蕉久久精品综合网| 精品亚洲国产成人| 久久精产国品一二三产品| 亚洲成人av在线资源| 二区三区亚洲精品国产| 中文字幕免费一二三区乱码 | 国产精品无码aⅴ嫩草| 亚洲第四色在线中文字幕| 欧美国产综合视频| 大地资源高清免费观看| 亚洲欧美日韩愉拍自拍| 久久亚洲精品成人av秋霞| 亚洲中文久久久精品无码| 国产精品成人午夜久久| 欧洲免费一区二区三区视频| 欧美国产日韩在线三区| 亚洲综合区激情国产精品| 亚洲欧美人成人让影院| 久久人妻无码一区二区三区av| 亚洲中文字幕无码av在线| 久久精品国产99精品亚洲| 国产精品自拍中文字幕| 欧美成人VA免费大片视频| 亚洲人成网站在线在线观看| 色成人亚洲| 国产99在线 | 欧美| 兴仁县| 中文字幕有码在线第十页| 久久这里有精品国产电影网| 亚洲欧美日韩综合在线丁香| 内射人妻视频国内|