デザインが分からないのか?メタデザインモード
ユーティリティーモード(Flyweight Pattern)は、その名の通りです.共有という意味です.メタはメタデータです.Javaプログラム設計では、主に作成オブジェクトの数を減らして、メモリの使用量を減らし、パフォーマンスを向上させるために使用されます.この設計モードはキャッシュの設計に似ています.JavaのString文字列キャッシュプールです.データベース接続プール、スレッドプールもこの考えに基づいています.
もっとわかりやすいように、簡単な栗を挙げてみましょう.
シーン①:絵を描くときはカラーペンが必要です.カラーペンはカラーペンの箱の中に保管されている.中色のカラーペンを使うときは箱の中に持って行って、もしなかったら1本買いに行きます.使い終わったらカラーボックスに入れ続けます.今度使うか箱の中に持って行きます.
分析:カラーペンは享元モードのメタデータです.箱はメタデータを格納する余分な空間です.新しいペンを買うのは、新しいオブジェクトを作成することに相当します.箱の中に私たちが欲しいカラーペンがあれば、もう買い直す必要はありません.そうすれば、このペンを繰り返し利用することができます.
ソース実装:
①まず、カラーペンインタフェースを作成します.
②カラーペンを生産する工場を作る.カラーペンの箱の中にあれば直接取り、なければ1本買いに行きます.
③テスト:
上記のように.リソースの再利用を実現し、メモリスペースとcpu性能の消費を節約します.また、稼働効率が向上しました.
享元モードは単例モードと非常に類似していることが分かった.しかし、完全にではありません.たとえばStringキャッシュプールにあります.Stringクラスについては多くの異なるStringインスタンスが用いられる(以上の例はこの点から実現されるメタモードではない.しかし設計思想は同じである).一方、単一のモードでは、クラスのグローバル範囲に1つのインスタンスしか存在しない必要があります.
もっとわかりやすいように、簡単な栗を挙げてみましょう.
シーン①:絵を描くときはカラーペンが必要です.カラーペンはカラーペンの箱の中に保管されている.中色のカラーペンを使うときは箱の中に持って行って、もしなかったら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つのインスタンスしか存在しない必要があります.