質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

2回答

3777閲覧

【TypeScript】シングルトンパターンは何故実装できるのでしょうか?

hasshy

総合スコア102

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2020/09/08 16:34

シングルトンパターンで、インスタンスを1回だけ作るソースコードを見ましたが違和感があります。
例えば下記のようなクラスがあります。

class Sample { private static instance: Sample; static getInstance() { if(! Sample.instance) { Sample.instance = new Sample(); } return Sample.instance; } }

2回インスタンスを生成しようとすると、1回目のみ新しくインスタンスを生成します。

// 最初は新しくインスタンスを作る const sample1 = Sample.getInstance() // 2回目はインスタンスを作らない const sample2 = Sample.getInstance()

ソースの流れからSampleクラス自体を上書きしているのは分かります。
上書きしているので、2回目でもクラスを呼び出したら上書きされた状態なんだろうなと推測できます。 
ただ、クラス自体を上書き出来る事が理解できません。
そもそも、クラスは何処で情報を保持しているのでしょうか?

class Sample { private static instance: Sample; static getInstance() { if(! Sample.instance) { Sample.instance = new Sample(); <-- このSampleは何処で保持されているのか? } return Sample.instance; } }

よく、クラスをたい焼きの金型の話に例える事があります。
あくまで、クラスはテンプレートであって、それ自体にデータを持たないと思っていました。
そもそもこの考え方に間違いがあるのでしょうか?

最終的に「そう言うものだ」でも良いのですが、もしお分かりになる方がいらっしゃればご教示いただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

違和感があります

同感です。これは、トランスパイルされた後のJavaScript がプロトタイプベースですので、尚のこと、そう感じます。

2回目でもクラスを呼び出したら上書きされた状態なんだろうなと推測

ご質問のコードで Sample.instanceSample.getInstance() も スタティックにアクセスしている点に注意してみてください。

  1. 最初の1回目は Sample.instance === undefined なので、new Sample() で上書き
  2. 2回目以降は、Sample.instance === [object Sample] なので、new Sample()は実行されません。

このSampleは何処で保持されているのか

JavaScript的には不要です。
シングルトンクラスをJavaScriptで表現する場合、 new 演算子も不要になります。

トランスパイル後のコードはわかりませんが、JavaScriptでシングルトンを書く例を2つ。

古典的な コンストラクタ関数で作る

javascript

1function Sample () { 2 throw "this class is static." 3} 4Sample.getInstance() { 5 return this; // 事実上、Sample namespace に与えられたプロパティを参照できる。 6}

オブジェクトリテラルで作る

javascript

1var Sample = { 2 getInstance() { 3 return this; 4 } 5}

JavaScriptでは、ネームスペースとなるオブジェクトのプロパティが、シングルトンクラスの実際となり、「どのようなメソッド/アクセサプロパティを持っているか?」は、まさに「たい焼きの金型」だと思います。
が、変数プロパティの場合、同一スコープで共有された変数のようになります。

冒頭に述べたとおり、TypeScriptのコードの書き方(静的型付け言語)と プロトタイプベースなJavaScriptのコードの書き方(動的型付け言語)とを整合するため、そういう形になるのだと思います。

投稿2020/09/08 22:38

AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2020/09/19 16:24

ご回答いただきありがとうございます。 ご連絡が遅れてしまい失礼いたしました。 また、javascript自体について掘り下げてご説明いただきありがとうございます。 (表現に語弊があったら申し訳ありませんが)TypeScriptで分かりやすいソースコードにするだけであって、トランスコンパイラしたjavascript的には不要ですね。
guest

0

そもそもそのタイプのシングルトンクラスの実装はTypeScriptで一般的なものなのでしょうか?
より直感的に理解しやすいのはこのようなパターンではないですか?

typescript

1class Singleton { 2 private static _instance : Singleton = new Singleton(); 3 private constructor(){} 4 public static get instance() :Singleton { 5 return this._instance; 6 } 7}

「これで出来るのはなぜか?」が質問の趣旨であるならば、回答として相応しくないかもしれませんが…

投稿2020/09/14 04:53

Hogeike

総合スコア293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2020/09/19 16:26

ご回答いただきありがとうございます。 ご連絡が遅れてしまい申し訳ありません。 サンプルコードを載せていただきありがとうございます。 私自身、たまたま見た記事でシングルトン を知ったので、一般的な方法を教えていただきとても助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問