初めに
アプリで、クラスのインスタンスが何個も作られてしまう。
そのような設計やコーディングをしていませんか?
私もその様な書き方をしていたのですが、
今回のシングルトンパターンを知り、『他のアプリなどがなぜ重くならないのか』、『なぜ設定を維持できているのか』を少し理解したかもしれません。
今回は、そのシングルトンパターンについてのメモです。
シングルトンパターンとはなにか
シングルトンパターンは、特定のクラスのインスタンスがアプリケーション全体で、ただ一つだけ生成されることを保証するためのデザインパターンです。
-
利用例
1. サーバーとの通信を行うクラス: 複数のインスタンスが作成され、複数の接続やセッションを管理することになってしまうと効率が悪くなり、リソースの浪費となります。
シングルトンパターンを使うことで、一つのインスタンスだけを使用しサーバーとのやり取りを一元管理できます。2. 設定を管理するクラス: アプリケーション内の各部分が同じ設定情報を必要とするとき、複数のインスタンスを作る代わりに、一つのインスタンスを共有することで一貫性を保つことができます。
例えば、ゲームの音量設定やコントローラ設定なども、シングルトンパターンにより、一度設定した情報をアプリ内のどこからでも再利用できます。 -
シングルトンパターンのメリット
・一貫性の確保:全体で同じインスタンスを利用するため、設定や状態の一貫性が保たれます。
・リソースの節約:複数のインスタンスを生成しないため、メモリやリソースの浪費を防ぎます。
・グローバルアクセス:アプリケーションのどこからでもインスタンスにアクセスできます。
シングルトンパターンを使用することで、一度作成したインスタンスを再利用することが可能となります。
実際のコード
例として、サーバとのやり取りを担うServerConnectクラスを用意します。
public class ServerConnect
{
private static ServerConnect _instance;
/// <summary>
/// インスタンス
/// </summary>
public static ServerConnect Instance => _instance ?? (_instance = new ServerConnect());
/// <summary>
/// プライベートコンストラクタ
/// </summary>
private ServerConnect()
{
//サーバ接続に必要な設定など
}
/// <summary>
/// 処理1
/// </summary>
public void ServerSession()
{
//接続処理
}
}
重要なポイントとして、
コンストラクタがprivateメソッドになっています。
これにより、外部からのインスタンスを防ぎ、複数作成させない様にします。
次に、
public static ServerConnect Instance => _instance ?? (_instance = new ServerConnect());
こちらで、初めてインスタンスしたときにコンストラクタで生成し、1度でも存在する場合新たに生成しない様になります。
メイン処理で使用する場合は以下の様になります。
class Main
{
public void UploadDate()
{
ServerConnect serverConnect = ServerConnect.Instance;
serverConnect.ServerSession();
}
}
ServerConnect.Instanceで、既存のServerConnectを呼び出し、ServerSessionメソッドを使用しています。
これにより、アプリ内で同じServerConnectを使うことができました。
最後に
今回シングルトンパターンについてのメモでした。
シングルトンパターンを使うことでアプリ内で同じインスタンスを利用するため、設定や状態の一貫性が保つことができます。
クラスを作る際に、コンストラクタはプライベートメソッドで外部から作られない様にすると尚、一貫性が出ます。