サンプルコード
using System.Reflection.Metadata.Ecma335;
/// <summary>
/// Flyweightパターンのサンプルコード
/// </summary>
public class Category
{
public string Name {get; set;} = "";
}
public class Address
{
Category _category;
public string Name {get; set;}
public string Uri {get; set;}
public Address(string name, string uri, Category category)
{
Name = name;
Uri = uri;
_category = category;
}
public string CategoryName {
get => _category.Name;
}
}
public class Program
{
static void Main()
{
// グループを作る
var category = new Category() {Name = "ブログ"};
List<Address> bookmark = [];
bookmark.Add(new Address("迷惑堂本舗", "https://maywork.net/", category));
bookmark.Add(new Address("迷惑堂本舗2", "https://maywork2.net/", category));
foreach(var a in bookmark)
{
Console.WriteLine($"名前:{a.Name} カテゴリ:{a.CategoryName}");
}
// 結果
// 名前:迷惑堂本舗 カテゴリ:ブログ
// 名前:迷惑堂本舗2 カテゴリ:ブログ
// 共通部分の変更
category.Name = "ウェブサイト";
foreach(var a in bookmark)
{
Console.WriteLine($"名前:{a.Name} カテゴリ:{a.CategoryName}");
}
// 結果
// 名前:迷惑堂本舗 カテゴリ:ウェブサイト
// 名前:迷惑堂本舗2 カテゴリ:ウェブサイト
}
}
感想
C#のコードでは無いですが、Flyweightパターンの例として次のような事例が当てはまると思います。
データベースで情報をスタックするテーブルがあり、そのテーブルには人物の名前を管理する必要がある場合、一般的に名前そのものではなく、人物を管理するマスターテーブルを用意し、スタックにはマスターのキーコードを記録するようにします。名前そのものはマスター側に持たせます。そうすることで氏名変更などがあった場合でもマスター側の名前を編集するだけでスタック側に反映させることが出来ます。多分この関係をオブジェクト指向プログラミングで表現するのがFlyweightパターンだと考えます。
コメント