2017-03-14 11 views
1

少し前、私は多くのデザインパター、特にクリエイティブなものを学びました。 しばらくして、私は存在していたが、私はそれを検索しようとしたときに何の参照も見つけられなかった。基本的には、クラスの依存関係を解決するためにクロージャを利用するファクトリの小さな変更です。実際、クラスの工場です。クラスのファクトリは有効なjavascriptパターンですか?

function Factory(depA,depB){ 

    function MyClass(something){ 
     this.something = something; 
    } 

    MyClass.prototype.methodA(){ // use depA} 
    MyClass.prototype.methodB(){ // use depB} 

    return MyClass 
} 

ここで、depAはデータベースであり、depBはロガーであるとしましょう。その後、私はクラスが実際にインスタンス化されるかの制御を失うことなく、一般的な依存関係を注入するため、このパターは非常に便利この

var BindedClass = Factory(database,logger); 
var instance = new BindedClass(something); 

のように工場を使用することができます。

ただし、これにはいくつかの問題があります。たとえば、これがあまり一般的ではないことを私に認識させたことの1つは、JSDocがこの種のパターンをまったくサポートしていないということです。

これは悪いパターンですか?私は、モジュール化のされていない、または動作していないドキュメンテーションツールを除けば、それに不利な点は見つけられません。

+0

'BindedClass'をどこかに保存し、' new BindedClass() 'を何度も呼び出すと、いくつかの意味があると思います。常に2つの行を連続して実行するだけであれば、 'Factory'が引数として' something'を取って普通のオブジェクトを返すようにすることもできます。 – JLRishe

+0

親愛なる@JLRhehe考えは確かにそれを行うことです。いずれにしても、クラスを使用することは、POJOに比べて2つの線を互いに近づけて実行する場合でも、POJOに比べていくつかの利点があります。 – Danielo515

答えて

0

はい、完全に受け入れられているパターンです。しかし、それを「ファクトリ」と呼ぶことはほとんどありませんが、より一般的なのは単なる「モジュール」です。この場合、依存性注入があります。 AMDのような多くのモジュールシステムはこのパターンを使用します。

しかし、工場でシングルトンが生成されるようにする必要があります。つまり、Factoryを複数回呼び出す必要はなく、複数の類似したクラスを作成してください。

+0

@Bergiさんへのお返事ありがとうございます。なぜそれがシングルトンであるべきだと思いますか?ファクトリを使用して、依存関係の異なる複数のクラスを作成したい場合はどうすればよいですか?これをJSDocでうまく文書化する方法を知っていますか?ありがとう! – Danielo515

+0

いくつかの類似クラスを作成すると、継承関係や共有可能なメソッドの重複で問題が発生します。このような場合には、実際にこれが必要な場合は、各クラスに共通の共通のベースクラスを継承させることをお勧めします。異なる依存関係を持つインスタンスがほんの少し必要な場合は、インスタンス作成プロセスに依存性注入を入れることを検討することもできます。 (もちろん、あなたのテスト環境では、DIをテストするために工場に何度も電話するのが大丈夫です) – Bergi

+0

いいえ、私はJSDocについて考えていません。私はたぶん複雑なケースでは不十分だと聞いていました。 – Bergi

関連する問題