Java言語で学ぶデザインパターン入門』を読んで、学んだ内容についてまとめます。FlyweightパターンFlyweightとはボクシングの軽量級である「フライ級」のことです。軽量級の意味することは「軽さ」であり、メモリの消費量が少ないことを指します。オブジェクトを生成するにはnewを行い、メモリを確保する(インスタンス化)必要がありますが、多くのオブジェクトを生成するとメモリを多く消費してしまい、処理の速度が遅くなってしまします。このような問題を解決するためには、すでにnewしたインスタンスに関しては繰り返し使用することが望ましいでしょう。このようにオブジェクトをできるだけnewせずに共有させることでメモリの消費量を抑制するパターンのことをFlyweightパターンと言います。登場人物Flyweightパターン使用するのは以下のクラス図に登場するクラスです。実装クラスFlyweight共有して利用するクラスを表します。実装すべきメソッドなどは特にありませんので、難しい点はありません。FlyweightFactoryFlyweightを生成するための工場役となるクラスです。この工場役を通してFlyweight役を作るとインスタンスを共有できるメソッドを持ちます。共有するインスタンスを格納するpoolフィールドと、Flyweightを取得するためのgetFlyewightメソッドを持ちます。ClientFlyweightFactoryを利用してFlyweightを利用するクラスです。Flyweightと同様に実装すべきメソッドなどは特に定まられていないため、難しい点はありません。具体例として、以下のクラスをもとに説明します。}}Stampクラスは共有して利用されるFlyweight役となるクラスです。文字charnameを受け取って生成され、printメソッドで文字を表示します。利用回数(useCount)と生成回数(newCount)が分かりやすいようにフィールドを持たせていますが、必須ではありません。}}Stampクラスを生成する工場であるFlayweightFactory役となるクラスです。生成されたインスタンスを管理するためのMapとしてpoolフィールドと、ここではSingletonパターンを適用しているため自身を表すsingletonフィールドを持ちます。このクラスの利用方法として外部からはまずgetInstanceメソッドを呼び出すことで自身を表すStampFactoryインスタンスを返却します。返却されたStampFactoryインスタンスに対して、charnameを引数としてgetStampメソッドを呼び出します。引数として渡されたcharnameをキーとしたStampインスタンスが既に生成されている場合にはpoolから取得しますが、インスタンスがまだ生成されていない場合にはインスタンスを生成してpoolに格納します。インスタンスを生成した場合にはnewCountに+1し、インスタンスの生成有無にかかわらずにuseCountを+1することで、各Stampインスタンスの生成回数と利用回数をカウントします。poolに格納しているStampインスタンスを全件出力するメソッドとしてprintAllPoolを実装しています。出力する内容は「キーとなる文字:利用回数:生成回数」です。}}Flyweight、FlyweightFactoryを利用するClient役となるクラスです。StampFactoryクラスのstaticメソッドであるgetInstanceメソッドを呼び出してstampFactoryインスタンスを取得し、取得したstampFactoryインスタンスに対してgetStampメソッドを呼び出すことで、poolフィールドにstampインスタンスを格納していきます。最後にprintAllPool()を呼び出すことでpoolフィールドを全件出力しています。実行結果Main.javaを実行した結果は以下になります。useCountが1より大きい文字に関しても、newCountは1回のみであり、インスタンスが再利用されていることが分かります。1メリットとデメリットFlyweightパターンを利用することでオブジェクトをnewする回数を削減することができ、メモリを節約することができます。デメリットとしてはpoolに格納されたオブジェクトはガベージコレクションの対象とはならず、メモリ上に残り続けてしまうため、メモリが不足しないように意図的に管理する必要があることがあげられます。まとめインスタンスを共有することでメモリの消費を抑制するFlyweightパターンに関して学びました。以下でサンプルコードをアップしていますのでよろしければ参考にどうぞ。Flyweightサンプルコードまた、他のデザインパターンに関しては以下でまとめていますので、こちらも参考にどうぞ。requestStockLike1@mk777SIer→Webに転職したエンジニア。学んだことなどをまとめていきます。upLoginユーザーは見つかりませんでした。