<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                **定義:**享元模式(Flyweight Pattern),運用共享技術有效地支持大量細粒度的對象。 類型:結構型模式。 適用情況: 1. 一個應用程序有大量的對象。 1. 對象的大多數狀態都是外部的。 1. 如果刪除對象的外部狀態,可以和相對較少的共享對象取代很多組對象。 1. 應用程序不依賴對象的標識,即應用程序依賴于對象的抽象接口。 **概述:** ?????? Flyweight,原意為“輕量級選手”的意思。翻譯者將它意為享元模式,是意譯,力求能夠直觀地表現出此模式的目的。享,共享之意。元,基本單元的意思。享元,也就是共享基本單元,也即GoF所言的運用共享技術有效地支持大量細粒度的對象。 ???????享元模式的重點在于將對象的“內部狀態”和“外部狀態”抽象出來,內部狀態存儲在享元對象中,而外部狀態在外部存儲。這個才是享元模式的關鍵,網上很多文章根本沒有講透這一點。 ????????下面舉一個示例。有一棋盤上的圍棋正好是大量細粒度的對象。我們將材質、形狀、制作工藝抽象為內部狀態,?而圍棋在棋盤上的位置是標識每一棋子的標記,故棋子的位置抽象為外部狀態。而棋子只有白黑兩種顏色,如果存儲在外部狀態里,會存兩種顏色很多次。故這里,白棋、黑棋作為兩個對象存在。 類圖**:** ![](https://box.kancloud.cn/2016-08-19_57b6b46665ffa.jpg) 參與者: 1. Client,調用ChessBoard得到具體的棋子對象。 1. Chessboard,管理棋子的生成以及存儲棋子的外部狀態,即每個棋子的具體位置。 1. Weiqi,圍棋抽象類,即享元對象,抽象出一些內部狀態來。 1. WhiteWeiqi、BlackWeiqi,兩個派生出的不同顏色的圍棋,實現顏色接口。 示例代碼: // Flyweight類 ~~~ public abstract class Weiqi { // 內部狀態 // ............... // private int nSize; public abstract Color GetColor(); } ~~~ // 具體的Flyweight類 ~~~ public class WhiteWeiqi : Weiqi { public override Color GetColor() { Console.WriteLine("White"); return Color.White; } } public class BlackWeiqi : Weiqi { public override Color GetColor() { Console.WriteLine("Black"); return Color.Black; } } ~~~ // FlyweightFactory類 ~~~ public class Blessboard { private List<Point> listWhite = new List<Point>(); private List<Point> listBlack = new List<Point>(); private WhiteWeiqi wWeiqi; private BlackWeiqi bWeiqi; public Blessboard() { wWeiqi = new WhiteWeiqi(); bWeiqi = new BlackWeiqi(); } public Weiqi Produce(bool bWthite, Point pt) { if (bWthite) { listWhite.Add(pt); return bWeiqi; } else { listBlack.Add(pt); return bWeiqi; } } public Weiqi GetProduce(Point pt) { foreach (Point p in listWhite) { if (p.Equals(pt)) { return wWeiqi; } } foreach (Point p in listBlack) { if (p.Equals(pt)) { return bWeiqi; } } return null; } } ~~~ // Client類 ~~~ class Program { static void Main(string[] args) { Blessboard bloard = new Blessboard(); // 生成棋子 bloard.Produce(true, new Point(1, 3)); bloard.Produce(false, new Point(2, 3)); bloard.Produce(true, new Point(1, 4)); bloard.Produce(false, new Point(2, 4)); // 查詢棋子黑白 Weiqi weiqi = bloard.GetProduce(new Point(2, 4)); Color color = weiqi.GetColor(); weiqi = bloard.GetProduce(new Point(1, 4)); color = weiqi.GetColor(); } } ~~~ **注意:**如果是C++,抽象類一定要注意析構函數一定要是虛函數。 優缺點: 1. 優點,減少內存的使用。 1. 缺點,加大了結構的復雜度,需要單獨管理外部狀態。 參考資料: 1. 《設計模式——可復用面向對象軟件基礎》 1. 《大話設計模式》 1. 《Head?First設計模式》
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看