問題タブ [factory-method]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1255 参照

design-patterns - ファクトリメソッドUML図の明確化

ここで説明するファクトリメソッドパターンを調べていました。Applicationから、からへDocumentとマークされた矢印の意味がよくわかりませんでしMyApplicationMyDocument。誰かがこの表記法を理解するのを手伝ってくれませんか。

代替テキスト

0 投票する
2 に答える
149 参照

castle-windsor - CastleのUsingFactoryMethod()にコンポーネントを登録するときに、依存関係のタイプを取得するにはどうすればよいですか?

CastleWindsorコンテナのバインディングを正しく取得するのに少し苦労しています。元の問題はlog4netと名前付きロガーに関するものであり、説明はこの質問にあります:log4netロガーの名前の設定

ただし、問題は現在、次のように絞り込まれています。

IAuditorを実装するクラスLog4NetAuditorがあります。一部のクラスは、タイプIAuditorのプロパティAuditorを持つ抽象クラスAuditableComponentを拡張します。CastleにIAuditorを登録すると、AuditableComponentを拡張するすべてのクラスのAuditorを解決および設定する方法がわかります。

ここで、Typeパラメーターを取得するためにLog4NetAuditorのコンストラクターが必要です。このタイプは、AuditableComponentを拡張するクラスのタイプである必要があります。私はこれをファクトリメソッドで実現しようとしましたが、うまくいきません。

私はこの問題を盲目的に見つめています。誰か助けてもらえますか?

0 投票する
2 に答える
1055 参照

c++ - ファクトリメソッドパターン

ファクトリメソッドとは正確には何ですか?dllでどのように実装できますか?

0 投票する
11 に答える
202400 参照

c++ - C++ でファクトリ メソッド パターンを正しく実装する方法

C++ には、かなり長い間不快に感じていたことが 1 つあります。

C++ で Factory Method を正しく実装するにはどうすればよいですか?

目標: クライアントがオブジェクトのコンストラクターの代わりにファクトリ メソッドを使用して、容認できない結果やパフォーマンス ヒットなしでオブジェクトをインスタンス化できるようにすること。

「ファクトリ メソッド パターン」とは、オブジェクト内の静的ファクトリ メソッドまたは別のクラスで定義されたメソッド、またはグローバル関数の両方を意味します。一般的には、「クラス X のインスタンス化の通常の方法をコンストラクター以外の場所にリダイレクトするという概念」です。

私が考えたいくつかの可能な答えをざっと見てみましょう。


0) ファクトリを作成しないで、コンストラクタを作成します。

これは良さそうに思えますが (実際、多くの場合、最善の解決策です)、一般的な解決策ではありません。まず第一に、オブジェクトの構築が、別のクラスへの抽出を正当化するのに十分なほど複雑なタスクである場合があります。しかし、その事実を脇に置いても、コンストラクターだけを使用する単純なオブジェクトであっても、多くの場合うまくいきません。

私が知っている最も単純な例は、2-D Vector クラスです。とてもシンプルですが、トリッキーです。デカルト座標と極座標の両方から構築できるようにしたいです。明らかに、私はできません:

私の自然な考え方は次のとおりです。

コンストラクターの代わりに、静的ファクトリーメソッドの使用につながります...これは、本質的に、何らかの方法でファクトリーパターンを実装していることを意味します(「クラスは独自のファクトリーになります」)。これは良さそうに見えますが (この特定のケースに適しています)、場合によっては失敗します。これについてはポイント 2 で説明します。読み進めてください。

別のケース: 一部の API の 2 つの不透明な typedef (無関係なドメインの GUID、または GUID とビットフィールドなど) によってオーバーロードしようとすると、型の意味がまったく異なります (つまり、理論的には有効なオーバーロード)。同じこと - unsigned ints や void ポインターのように。


1) Java 方式

動的に割り当てられたオブジェクトしかないため、Java は単純です。工場を作ることは、次のように簡単です。

C++ では、これは次のように変換されます。

涼しい?多くの場合、確かに。しかし、これにより、ユーザーは動的割り当てのみを使用するようになります。静的割り当ては、C++ を複雑にするものですが、多くの場合、C++ を強力にするものでもあります。また、動的割り当てを許可しないターゲット (キーワード: 埋め込み) がいくつか存在すると思います。そしてそれは、それらのプラットフォームのユーザーがクリーンな OOP を書くことを好むという意味ではありません。

とにかく、哲学はさておき: 一般的なケースでは、ファクトリのユーザーに動的割り当てを強制することはしたくありません。


2) 値渡し

わかりましたので、動的割り当てが必要な場合は 1) がクールであることがわかります。その上に静的割り当てを追加しないのはなぜですか?

何?戻り値の型でオーバーロードできませんか? もちろん、できません。それを反映するようにメソッド名を変更しましょう。そうです、上記の無効なコード例を書いたのは、メソッド名を変更する必要がどれだけ嫌いかを強調するためです。たとえば、名前を変更する必要があるため、言語に依存しないファクトリ デザインを適切に実装できないためです。このコードのすべてのユーザーは、仕様との実装の違いを覚えておく必要があります。

わかりました...これで終わりです。メソッド名を変更する必要があるため、見苦しいです。同じコードを 2 回記述する必要があるため、これは不完全です。しかし、一度完了すると機能します。右?

まあ、通常。しかし、そうでない場合もあります。Foo を作成するとき、実際にはコンパイラに依存して戻り値の最適化を行います。C++ 標準は、コンパイラ ベンダーがオブジェクトをいつインプレースで作成し、いつオブジェクトを返すときにコピーするかを指定しないように十分に親切であるためです。 C++ の値による一時オブジェクト。したがって、Foo をコピーするのにコストがかかる場合、このアプローチは危険です。

Foo がまったくコピー可能でない場合はどうなるでしょうか。ええと。(コピー省略が保証されている C++17 では、上記のコードではコピー不可であることはもはや問題ではないことに注意してください)

結論: オブジェクトを返すことによってファクトリを作成することは、確かにいくつかのケース (前述の 2-D ベクトルなど) の解決策ですが、それでもコンストラクターの一般的な置き換えにはなりません。


3) 二期工事

誰かが思いつくであろうもう 1 つのことは、オブジェクトの割り当てとその初期化の問題を分離することです。これは通常、次のようなコードになります。

それは魔法のように機能すると思うかもしれません。私たちのコードで支払う唯一の代償は...

全部書いてこれを最後にしてしまったのだから、これも嫌いに違いない。:) どうして?

まず…二相施工という概念が大嫌いで、使っていると罪悪感を感じます。「存在する場合は有効な状態にある」というアサーションでオブジェクトを設計すると、コードがより安全になり、エラーが発生しにくくなると感じます。それが好き。

その慣習を捨てて、工場を作るためだけにオブジェクトのデザインを変更しなければならないのは..まあ、扱いにくいです。

上記が多くの人を納得させるものではないことはわかっているので、もう少し確固たる議論をしましょう。2 フェーズ構成を使用すると、次のことができなくなります。

  • constメンバー変数の初期化または参照、
  • 基本クラスのコンストラクターとメンバー オブジェクトのコンストラクターに引数を渡します。

そしておそらく、今は考えられないいくつかの欠点があるかもしれません。上記の箇条書きがすでに私を納得させているので、特に義務付けられているとは感じていません.

そのため、ファクトリを実装するための優れた一般的なソリューションにはほど遠いものです。


結論:

次のようなオブジェクトのインスタンス化の方法が必要です。

  • 割り当てに関係なく均一なインスタンス化を可能にし、
  • 構築メソッドに異なる意味のある名前を付けます (したがって、引数によるオーバーロードに依存しません)。
  • 特にクライアント側で、重大なパフォーマンス ヒット、できれば重大なコード膨張ヒットを導入しない
  • のように、一般的である: どのクラスにも導入できる。

私が言及した方法がそれらの要件を満たさないことを証明したと思います。

ヒントはありますか?解決策を教えてください。この言語では、このような些細な概念を適切に実装できないとは思いたくありません。

0 投票する
22 に答える
255303 参照

factory-pattern - Abstract FactoryとFactoryデザインパターンの違いは何ですか?

これら2つのパターンの違いについて多くの投稿があることは知っていますが、見つけられないことがいくつかあります。

私が読んでいることから、ファクトリメソッドパターンを使用すると、単一の具体的な製品を作成する方法を定義できますが、一般的な製品が表示されるため、クライアントから実装を隠すことができます。私の最初の質問は、抽象ファクトリについてです。単一のコンクリートオブジェクトではなく、(使用する特定のファクトリに応じて)コンクリートオブジェクトのファミリを作成できるようにする役割はありますか?抽象ファクトリは、呼び出すメソッドに応じて、1つの非常に大きなオブジェクトまたは多数のオブジェクトのみを返しますか?

私の最後の2つの質問は、私が多くの場所で見たことを完全には理解できない単一の引用についてです。

2つの違いの1つは、抽象ファクトリパターンでは、クラスがオブジェクトのインスタンス化の責任をコンポジションを介して別のオブジェクトに委任するのに対し、ファクトリメソッドパターンは継承を使用し、サブクラスに依存して目的のオブジェクトのインスタンス化を処理することです。

私の理解では、ファクトリメソッドパターンには、どのConcreteProductをインスタンス化するかをConcreteCreatorが認識できるようにするCreatorインターフェイスがあります。これは、継承を使用してオブジェクトのインスタンス化を処理することの意味ですか?

さて、その引用に関して、Abstract Factoryパターンは、オブジェクトのインスタンス化の責任をコンポジションを介して別のオブジェクトにどの程度正確に委任しますか?これは何を意味するのでしょうか?Abstract Factoryパターンも、私の目には継承を使用して構築プロセスを実行しているように見えますが、それでも私はこれらのパターンについてまだ学習しています。

特に最後の質問で助けていただければ幸いです。

0 投票する
1 に答える
13285 参照

java - EasyMockファクトリメソッドによって生成されたBeanの自動配線?

私には本当に奇妙に思える問題があります。私は次の設定をしています:

インターフェース:

スプリングコンポーネント:

EasyMockによって生成されたモックビーンを使用したスプリングテスト構成:

そしてユニットテスト:

プロジェクトはコンパイルされ、テストは問題なく合格します。つまり、SomeClass(「実際の」オブジェクト)とSomeDependency(EasyMockによって生成されたモックオブジェクト)の両方の自動配線が成功します。

ただし、SomeClassの実装を次のように変更した場合:

両方のテストが失敗するのは

だから私の質問は:

  1. SpringがSomeClassへの依存関係の自動配線に失敗するのはなぜですか( SomeClassTestへの同じ依存関係の自動配線に成功した場合)?
  2. SomeClassTestまたはtestconfig.xmlを変更して、テストに合格させるにはどうすればよいですか?

コメント:実際には、 SomeClassで表されるクラスはフレームワークの一部です。その結果、少なくとも妥当な時間内に、簡単に更新することはできません。

依存関係:

  • 春:3.0.5.RELEASE
  • EasyMock:3.0

編集:

Spring 3.2 RC1の時点で、ジェネリックファクトリメソッドとモックオブジェクトの問題が解決されました。

/マティアス

0 投票する
4 に答える
62416 参照

java - Spring と実行時の factory-method へのパラメーターの受け渡し

メソッド context.getBean(name, user) のドキュメントには、

明示的なコンストラクター引数/ファクトリ メソッド引数を指定できるようにします

しかし、私が何をしても(すべてを試しました)、最も論理的な設定で、初期化中にBeanがロードされているときにこれを取得します:



解説ではできると書いてありますが、そのbeanのxml定義でコンストラクタ引数を指定してもしなくても失敗します。

0 投票する
2 に答える
257 参照

c# - C# のファクトリ デザイン パターンを有利に開始できる優れたソース コード

コードの一部でファクトリ メソッド デザイン パターンの使用を開始する必要があると感じています。これが私がやっていることです。

以下のコードは、Accom 名前空間のジェネレーター クラスです。

Traf 名前空間も同じように起動します。

だから、これは何度も何度も繰り返されます。

そのためのファクトリパターンを作成しようとしましたが、すべての抽象クラスが混在していて、かなり混乱しました(そのようなことをやろうとしているのはこれが初めてだからだと思います)。

誰かがこれについて私を助けて、私が読んで理解できる良いソースコードを教えてくれますか?

0 投票する
8 に答える
7743 参照

design-patterns - ファクトリメソッドデザインパターン

本によると:

ファクトリパターンの本質は、「オブジェクトを作成するためのインターフェイスを定義しますが、インスタンス化するクラスをサブクラスに決定させることです。ファクトリメソッドを使用すると、クラスはサブクラスへのインスタンス化を延期できます。

クリエイタークラスがあるとしましょう。

わかりました、それは私のクリエイタークラスですが、わかりません

Factoryメソッドを使用すると、クラスはインスタンス化をサブクラスに延期できます

サブクラスとは何の関係がありますか?そして、私はサブクラスを何に使用することになっていますか?

誰かが私にいくつかの例を与えることができますか?