C#でデザインパターン「Flyweightパターン」

C# コンピュータ
C#
Flyweightパターンは、オブジェクトに共通の属性がある場合、その属性のオブジェクトを一つ作りそれを参照すると、一か所に集約されるため、一か所を編集するだけで参照している全てのオブジェクトに反映されます。また、参照ですのでメモリの節約につながる場合も考えられるます。

サンプルコード

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 カテゴリ:ウェブサイト

    }
}

感想

サンプルコードはウェブブラウザのURIのブックマーク機能のカテゴリ分類部分をコード化したつもりです。カテゴリ名の変更がアドレスオブジェクトに反映していることが確認できました。

C#のコードでは無いですが、Flyweightパターンの例として次のような事例が当てはまると思います。
データベースで情報をスタックするテーブルがあり、そのテーブルには人物の名前を管理する必要がある場合、一般的に名前そのものではなく、人物を管理するマスターテーブルを用意し、スタックにはマスターのキーコードを記録するようにします。名前そのものはマスター側に持たせます。そうすることで氏名変更などがあった場合でもマスター側の名前を編集するだけでスタック側に反映させることが出来ます。多分この関係をオブジェクト指向プログラミングで表現するのがFlyweightパターンだと考えます。

コメント