• 締切済み

Singletonの使い方

kaihou100の回答

  • kaihou100
  • ベストアンサー率83% (10/12)
回答No.3

 Singletonとは、ある世界に一つしかないものをあらわします。  たとえば一人の人間を表しているシステムがあったとして、 「右手」クラスのインスタンスは二つ以上あったら、その 「人間」はミュータントになってしまいますよね?  こんなときに使います。  こうしておくと、たとえば「小脳」クラスが「右手」を 使っても、「骨髄」クラスが「右手」を使っても、必ず 同じインスタンスを利用することになり、二つ目の手を 作ったり、利用してしまうことがありません。  また応用として、Singletonパターンは、引数を付加する ことにより、いくつもある同じ構造の設定ファイルの キャッシュなどにも使えます。 # 詳細は記しません。 # 例題としてやってみると、面白いかと思いますので。  構造は単純なのだけど、結構興味深いパターンです。  面白い利用法を思い浮かべたら、公開ドキュメントにして 多くの人を幸せにしてあげてください。

関連するQ&A

  • singletonパターン

    デザインパターンを勉強しているのですが、一つ気になっていることがあります。singletonパターンを使うとき、staticなメソッドgetInstance();で、唯一のインスタンスを得る場合、コードは Singleton obj1 = Singleton.getInstance(); となります。ここで疑問に思ったんですが、あるメソッドを使う場合、 instance名.method();という具合に記述されるんですが、この場合、 class名.method();となっています。メソッドを使うときって、class名.method();でも大丈夫なんですか?質問文がわかりにくいかもしれませんがどうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • singletonの使い方

    はじめまして。 singleton(GoF)で少し疑問に思ったところがありましたので、 アドバイスをいただけたらと思い質問させていただきます。 たとえば以下のようなプログラムですが、 ==form.html== <html> <body> <form action="./Main.php" method="post"> name:<br /> <input type="text" size="20" name="name" /><br /> text:<br /> <textarea rows="8" cols="40" name="text"></textarea><br /> <br /> <input type="submit" value="submit!" /> <input type="reset" value="reset!" /> </form> </body> </html> ==Main.php== <?php require_once "Data.php"; require_once "NullCheck.php"; $data =& Data::getInstance(); $data->setName($_POST["name"]); $data->setText($_POST["text"]); $nc = new NullCheck($data); $result = $nc->check(); if(!$result == ""){ echo $result; }else{ echo "ok"; } ?> ==Data.php== <?php class Data{ var $name; var $text; function &getInstance(){ static $instance; if(!isset($instance)){ $instance = new Data(); } return $instance; } function setName($name){ $this->name = $name; } function setText($text){ $this->text = $text; } function getName(){ return $this->name; } function getText(){ return $this->text; } } ?> ==NullCheck.php== <?php class NullCheck{ var $data; var $err = ""; function NullCheck($data){ $this->data = $data; } function check(){ if($this->data->getName() == ""){ $err .= "nameが空欄です。<br>"; } if($this->data->getText() == ""){ $err .= "textが空欄です。<br>"; } return $err; } } ?> 上記を作る際、 submitを押すたびにオブジェクトが作られるのは無駄だと思い、 singletonを使いました。 しかし、空欄チェックのときはnewでインスタンスを生成しています。 やはりこの場合もsingletonを使用したほうがいいのでしょうか? 仮にもっと複雑な問い合わせフォームを作成し、 利用者が多くなった場合、 いろいろとインスタンス化(空欄チェックや文字列チェック等)すると オブジェクトがたくさんできてしまい負荷がかかるで、 できる限り不必要なインスタンス化は避けたいと思っています。 長々と書いてしまい申し訳ありませんが、 なにとぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • C++でのスレッドセーフなSingletonデザインパターン

    私は今までDouble Checked Locking Patternを使ってSingletonを実装していましたが、 これがどうもスレッドセーフではないらしく、 スレッドセーフなSingletonのソースを探しています。 検索エンジンや書籍で漁っているものの奥が深いらしく、 スレッドセーフでなかったりDouble Checked Locking Patternが使われているものばかりで、 目的のものは見つかりませんでした。 C++においてスレッドセーフなSingletonを実装することは、 もしかして不可能なのでしょうか? もしソースや方法をご存知の方がいらっしゃればお教えいただけると助かります。 よろしくお願いします

  • define_singleton_methodについて

    define_singleton_methodについて 1.9.1p378を使用しています。 メタプログラミングに興味があって、 Classに動的に生成したmethodを追加する方法を調べてみると 色々な教科書にdefine_methodを使う例が書いてあるのを見つけました。 しかし、実際にプログラムしてみると"undefined method"になってしまいます。 Class.methods.grep /define/ してみると、"define_singleton_method"というものがあり、 define_methodの代わりに使ってみたら一応期待通りに動作しました。 googleで調べてみてもdefine_singleton_methodについて解説が見つけられませんでした。 1.9系になって名前が変わったのでしょうか? それとも似て非なるものなのでしょうか? 詳しい方、教えてください。<(_ _)>

    • ベストアンサー
    • Ruby
  • C# クラスのインスタンスについて

    クラス(ClassA)を作成した後に別のクラス(ClassB)内でClassAインスタンスを作成したとします。 このインスタンスをさらに別のクラス(ClassC)で使用したいと思うの ですが可能なんでしょうか? 要するに1つのインスタンスを他で使いまわすような事ができないの かなって思っています。 自分で調べると「Singletonパターン」という方法があるようですが 他の方法もあれば知ってみたいと思っています。 ※環境はWinXP、VS2005 C# です。 以上ですが、よろしくお願いいたします。

  • singletonメソッドへのアクセス

    インスタンスメソッドからsingletonメソッドへのアクセスが、思ったようにできません。 はじめは、次のように記述すれば動作すると思っていました。 (MyClass.get_hello_wordをインスタンスメソッドから呼び出し) class MyClass  def hello   puts self.get_hello_word # エラー発生源  end  def self.get_hello_word   'hello every one'  end end MyClass.new.hello # エラー しかし、実際には次のように記述しなければ動きませんでした。 class MyClass  def hello   puts self.class.get_hello_word # self.classのワンクッション  end  def self.get_hello_word   'hello every one'  end end MyClass.new.hello そもそも、 def self.get_hello_word と定義したんだから、参照する時も同様にできてもいいのではないかと思うんですけれど、何か認識が間違っているのでしょうか。 だとしたら、(勘で言いますと) class << MyClass  def get_hello_word   'hello every one'  end end の文法の考え方がからんでいるような気がするのですが・・ ちんぷんかんぷんです。 どうかこの辺りの知識を教えて頂けないでしょうか。 あと、self.class.get_hello_wordの記述方法よりも簡単な(そうすべき)書き方があれば教えて下さい。

    • ベストアンサー
    • Ruby
  • C++ シングルトン マルチスレッド

    標準C++でシングルトンを実装したいのですが。 class Singleton{ public: static Singleton* getInstance(){ if (_instance == NULL){ //スレッドAがこの時点で、スレッドBがNULLチェックすると破綻する _instance = new Singleton(); } return _instance; } private: Singleton(); static Singleton* _instance; }; マルチスレッドになると上記のパターンで破綻するといわれどうしたものかと考えております。 static Singleton* _instance = new Singleton(); と出来れば解決なのですが 「static const int データメンバ以外をクラス内で初期化することはできません」 とのことでそれもできず。 どのようにすればよいでしょうか。

  • コンストラクタって?

     ↓    ↓    ↓ クラスを基にインスタンス化を行いますが このときに初期化を行わなくてはならないことがあります。 それを実現するのが「コンストラクタ」です。 のような解説はたくさん読んできたのですが 具体的にどういう場合にコンストラクタを使用するのでしょうか? プログラムには必ずコンストラクタは必要なんですか? 例えばシューティングゲームを作るときの こういう処理にコンストラクタが役立つんだよー! などという具体的な例があればぜひ教えてください。 どなたかご協力よろしくお願いします!

    • ベストアンサー
    • Java
  • クラス、オブジェクト、インスタンス、メソッドについて。

    クラス、オブジェクト、インスタンス、メソッドに ついて教えていただけないでしょうか? 今現在の自分の認識では、乗り物を例にすると、 「乗り物」という大枠がクラス。それを、たとえば 飛行機なり電車なり船なり、より具体的にした ものがインスタンス=オブジェクト。 その具体化したものの挙動、動作(走るとか飛ぶとか) がメソッド、という理解です。 ただ、これだとオブジェクトとインスタンスを 同じものとして見てしまっているので、この2つの 違いを明確に説明しろと言われると困ってしまいます。 インスタンスとオブジェクトの違いを明確にした上で うまく伝えられる方法があれば、ご教授ください。

  • シングルトンコードが分からないので教えてください

    リンク先JavaScriptコードで、どうして「あるクラスのオブジェクト(インスタンス)をひとつに限定」することになるのでしょうか? http://javascript.keicode.com/adv/singleton.php ・「アプリケーションの情報をグローバルに保持するオブジェクト」とは、var MyAppのことでしょうか? ・ただ一つのオブジェクト(しかもその内容がただ一つのプロパティ)をreturnすることを、シングルトンと呼ぶのでしょうか?