「委譲」に似ているもの

Copyright (C) 2024 Takym.

注意事項

比較

基となる型

継承

転送

関数参照

Adapter パターン

シングルトンと関数参照

インターフェース定義

public interface ISomeInterface
{
	public void DoSomething();
}

通常のシングルトン

public sealed class Singleton1 : ISomeInterface
{
	private static readonly Singleton1 _inst = new();

	public static Singleton1 Instance => _inst;

	private Singleton1() { }

	public void DoSomething() { /* ... 任意の処理 ... */ }
}

public sealed class Singleton2 : ISomeInterface
{
	private static readonly Singleton2 _inst = new();

	public static Singleton2 Instance => _inst;

	private Singleton2() { }

	public void DoSomething() { /* ... 任意の処理 ... */ }
}

public sealed class Singleton3 : ISomeInterface
{
	private static readonly Singleton3 _inst = new();

	public static Singleton3 Instance => _inst;

	private Singleton3() { }

	public void DoSomething() { /* ... 任意の処理 ... */ }
}

移譲を用いる場合(null 拒否)

public sealed class Singletons : ISomeInterface
{
	private readonly DoSomethingFunction _func;

	private static readonly Singleton _inst1 = new(_ => { /* ... 任意の処理 ... */ });
	private static readonly Singleton _inst2 = new(_ => { /* ... 任意の処理 ... */ });
	private static readonly Singleton _inst3 = new(_ => { /* ... 任意の処理 ... */ });

	public static Singleton Instance1 => _inst1;
	public static Singleton Instance2 => _inst2;
	public static Singleton Instance3 => _inst3;

	private Singletons(DoSomethingFunction func)
	{
		ArgumentNullException.ThrowIfNull(func);

		_func = func;
	}

	public void DoSomething() => _func(this);

	private delegate void DoSomethingFunction(Singletons context);
}

移譲を用いる場合(null 許容)

public sealed class Singletons : ISomeInterface
{
	private readonly DoSomethingFunction? _func;

	private static readonly Singleton _inst1 = new(_ => { /* ... 任意の処理 ... */ });
	private static readonly Singleton _inst2 = new(_ => { /* ... 任意の処理 ... */ });
	private static readonly Singleton _inst3 = new(_ => { /* ... 任意の処理 ... */ });

	public static Singleton Instance1 => _inst1;
	public static Singleton Instance2 => _inst2;
	public static Singleton Instance3 => _inst3;

	private Singletons(DoSomethingFunction? func)
	{
		_func = func;
	}

	public void DoSomething() => _func?.Invoke(this);

	private delegate void DoSomethingFunction(Singletons context);
}

余談

この記事は、下記の画像(ファイルプロパティのスクリーンショット)の通り、昨年末頃から用意していたものをやっと公開できた。

Windows 10 のエクスプローラーのプロパティの表示

参考文献