デザインが分からないのか?メタデザインモード


ユーティリティーモード(Flyweight Pattern)は、その名の通りです.共有という意味です.メタはメタデータです.Javaプログラム設計では、主に作成オブジェクトの数を減らして、メモリの使用量を減らし、パフォーマンスを向上させるために使用されます.この設計モードはキャッシュの設計に似ています.JavaのString文字列キャッシュプールです.データベース接続プール、スレッドプールもこの考えに基づいています.
もっとわかりやすいように、簡単な栗を挙げてみましょう.
シーン①:絵を描くときはカラーペンが必要です.カラーペンはカラーペンの箱の中に保管されている.中色のカラーペンを使うときは箱の中に持って行って、もしなかったら1本買いに行きます.使い終わったらカラーボックスに入れ続けます.今度使うか箱の中に持って行きます.
分析:カラーペンは享元モードのメタデータです.箱はメタデータを格納する余分な空間です.新しいペンを買うのは、新しいオブジェクトを作成することに相当します.箱の中に私たちが欲しいカラーペンがあれば、もう買い直す必要はありません.そうすれば、このペンを繰り返し利用することができます.
ソース実装:
①まず、カラーペンインタフェースを作成します.
public interface IColourPen {
     
    /**
     *   
     * @param content      
     */
    void draw(String content);
}


②カラーペンを生産する工場を作る.カラーペンの箱の中にあれば直接取り、なければ1本買いに行きます.
public class ColourPenFactory{
     
    /**
     *   。       
     */
    private final static Map<ColourPenType, IColourPen> PEN_CACHE = new ConcurrentHashMap<>(8);


    public static IColourPen get(ColourPenType colourPenType){
     
        IColourPen pen = PEN_CACHE.get(colourPenType);
        if (null == pen){
     
            System.out.println(String.format("         %s   ",colourPenType.name()));
            switch (colourPenType.name()){
     
                case "RED":
                    pen = new RedColourPen();
                    System.out.println("               ");
                    break;
                case "BLACK":
                    pen = new BlackColourPen();
                    System.out.println("               ");
                    break;
                default:
                    throw new IllegalArgumentException("    ");
            }
            PEN_CACHE.put(colourPenType,pen);
        }else {
     
            System.out.println(String.format("         %s    ,          ",colourPenType.name()));
        }
        return pen;
    }



    public enum ColourPenType {
     
        RED, BLACK, GREEN, GRAY, BLUE,
    }
}

③テスト:
IColourPen pen1 = ColourPenFactory.get(ColourPenFactory.ColourPenType.RED);
IColourPen pen2 = ColourPenFactory.get(ColourPenFactory.ColourPenType.RED);
IColourPen pen3 = ColourPenFactory.get(ColourPenFactory.ColourPenType.RED);
System.out.println(pen1);
System.out.println(pen2);
System.out.println(pen3);

IColourPen pen4 = ColourPenFactory.get(ColourPenFactory.ColourPenType.BLACK);
System.out.println(pen4);

    :

         RED   
               
         RED    ,          
         RED    ,          
com.dong.designs.bridge.RedColourPen@24d46ca6
com.dong.designs.bridge.RedColourPen@24d46ca6
com.dong.designs.bridge.RedColourPen@24d46ca6
         BLACK   
               
com.dong.designs.bridge.BlackColourPen@372f7a8d

上記のように.リソースの再利用を実現し、メモリスペースとcpu性能の消費を節約します.また、稼働効率が向上しました.
享元モードは単例モードと非常に類似していることが分かった.しかし、完全にではありません.たとえばStringキャッシュプールにあります.Stringクラスについては多くの異なるStringインスタンスが用いられる(以上の例はこの点から実現されるメタモードではない.しかし設計思想は同じである).一方、単一のモードでは、クラスのグローバル範囲に1つのインスタンスしか存在しない必要があります.