C#とシングルトン

アバター
ナムアニクラウド
記事: 16
登録日時: 15年前
住所: 茨城県

C#とシングルトン

投稿記事 by ナムアニクラウド » 14年前


 プログラミングにおけるデザインパターン、「Singletonパターン」を知っている人は多いと思います。
インスタンスを一つしか生成できないクラスなどを作って利用するパターンです。
C++では、次のように実装できますね。

CODE:

class Singleton
{
private:
	//コンストラクタ、コピーコンストラクタ、=演算子を封印
	Singleton(){}
	Singleton( const Singleton& );
	void operator=( const Singleton& );
	
public:
	//static変数は一度だけ生成されるので、唯一のインスタンスとなる
	static Singleton* GetInstance()
	{
		static Singleton instance_;
		return &instance_;
	}
	
	//何か実装
}
 さて、自分は最近はC#で開発していますが、C#でも同じような実装が可能です。
しかし、「静的クラス」というのを知ったときに、「これはそのままSingletonなんじゃないか」と思ったのです。
「静的クラス」というのは、
 ・インスタンス生成が出来ない
 ・静的メンバしか持てない
という特徴を持ったクラスです。
グローバルなインスタンスのように扱えるので、「比較的安全なグローバル変数」とも言われたりするシングルトンにぴったりでは?

 「静的クラス シングルトン」でググってみると、同じことを考えている人多数。
割合と一般的なのかしらん。
ちょっとコレで実装を進めてみようかな。

 ちなみに以下のような感じになります。

CODE:

static class Singleton
{
	//何か実装
}
[/size]

アバター
バグ
記事: 130
登録日時: 15年前

Re: C#とシングルトン

投稿記事 by バグ » 14年前

従来通りの実装方法でも実現は可能ですが、C#では静的クラスにしてしまったほうが手っ取り早いですよね(^-^)

ISLe
記事: 2650
登録日時: 15年前

Re: C#とシングルトン

投稿記事 by ISLe » 14年前

staticの付いたインスタンスは生成のタイミンクが処理系依存なので、初期化する順序を守らないといけないハードウェアリソースを管理するクラスとかには使えないのですよね。

アバター
ナムアニクラウド
記事: 16
登録日時: 15年前
住所: 茨城県

Re: C#とシングルトン

投稿記事 by ナムアニクラウド » 14年前

>バグさん
 そうですね。
なんだか最初からシングルトンでの利用を図ってやったかのように都合のいい機能ですよね、静的クラス。
そんなこんなでC#って結構使いやすいと思うんですよ。

>ISLeさん
 C#でも、シングルトンパターンを従来通りに実装するメリットが無いわけではないと聞きます。
従来通りの実装をした場合のみ、実体化の遅延が可能になるんでしたね。

ISLe
記事: 2650
登録日時: 15年前

Re: C#とシングルトン

投稿記事 by ISLe » 14年前

静的クラスでお手軽にシングルトンを実装することはできますが、静的クラスとシングルトンは別物です。
グローバル変数の代わりでもないです。

インスタンス生成できないと変数に代入できません。引数に使うこともできません。
継承もオーバーライドもできないとインターフェースを定義したベースクラスを持てないのでフレームワークに組み込めません(拡張もできない)。
なのでソースコードの汎用性を著しく落とします。
静的クラスを使うときはそのクラスと心中するくらいのつもりか二度と他で使わないつもりでないといけない気がします。

C++やJavaでも静的メンバしか持たないクラスを作れば同じことができます。
メンバひとつひとつにstatic付けるのは面倒くさいですけどね。

アバター
ナムアニクラウド
記事: 16
登録日時: 15年前
住所: 茨城県

Re: C#とシングルトン

投稿記事 by ナムアニクラウド » 14年前

>ISLeさん
 い、言われてみれば・・・orz
まあ、静的クラスがもともとシングルトンのためにあるなんて誰にも言われてませんしね。
いい勉強になりました。

ISLe
記事: 2650
登録日時: 15年前

Re: C#とシングルトン

投稿記事 by ISLe » 14年前

C#(Javaも)の標準ライブラリに静的クラスで実装されているのはMathクラスしか無かったと思います。
三角関数は世界がひっくり返りでもしなければ未来永劫変化しないですからね。
標準で付いてくるライブラリの実装を眺めてみるだけでも面白い発見がありますよ。