JavaScriptのオブジェクト指向パターン。 Factoryパターン

コードを整理することは、私たちを多くの苦痛から救ってくれるでしょう。 オブジェクト指向プログラミングの機能を使用すると、必要に応じて、より良い可読性を達成し、冗長性を減らし、抽象化を作成するために、特定のデザイン パターンを採用することができます。 ファクトリー パターンは、DRY 方法論に従ったオブジェクト指向パターンの一種です。 その名前が示すように、オブジェクトのインスタンスは、必要なオブジェクトを作成してくれるファクトリーを使用して作成されます。

alligator オブジェクトを組み立てるためにファクトリー パターンを使用する、非常に単純な例を見てみましょう。

class TailFactory { constructor(props) { this.tailLength = props.tailLength; }};class TorsoFactory { constructor(props) { this.color = props.color; }};class HeadFactory { constructor(props) { this.snoutLenth = props.snoutLenth; }};

では、実際のファクトリー クラスとユーザーとの間で仲介役を務めるクラスを作成します。 これをReptilePartFactoryと呼びましょう。

class ReptilePartFactory { constructor(type, props) { if(type === "tail") return new TailFactory(props); if(type === "torso") return new TorsoFactory(props); if(type === "head") return new HeadFactory(props); }};

実際のワニを組み立てて、ReptilePartFactoryを使って必要なパーツを取得してみましょう:

let alligator = {};let alligatorProps = { tailLength : 2.5, color: "green", snoutLenth: 1};//gets a tail from the tail factoryalligator.tail = new ReptilePartFactory("tail", alligatorProps); //gets a torso from the torso factoryalligator.torso = new ReptilePartFactory("torso", alligatorProps);//gets a head from the head factoryalligator.head = new ReptilePartFactory("head", alligatorProps);

上のパターンを見てみると、同じReptilePartFactoryを使ってワニのようなオブジェクトのパーツを作成できるような気がします。 バックグラウンドのファクトリーは、最終的なオブジェクトの性質について知る必要はありません。

したがって、ファクトリー パターンを使用すると、特定の利点が得られます。

  • 抽象化:オブジェクトの型が実行時に決定されるような場合に使用することができる。
  • 再利用性/保守性:ユーザが実際のオブジェクトのコンストラクタにアクセスする必要がない。
  • Factory パターンについてある程度理解できたので、より良い Factory パターン コードを書くことについて少し掘り下げてみましょう。 これは単純な実装で、直感的であり、変更に対してあまりオープンではありません。 もし、後で新しい部品を追加するのであれば、ReptilePartFactoryを乱さなければなりません。 これは、「ソフトウェアの実体 (クラス、モジュール、関数など) は、拡張に対してはオープンであるが、変更に対してはクローズであるべきだ」という SOLID 原則に違反します。

    オブジェクトにファクトリクラスを格納して、必要なパーツをキーとして使用して、必要なパーツファクトリを呼び出してはどうでしょうか。

    let registeredPartFactories = {};registeredPartFactories = class TailFactory{ ...};registeredPartFactories = class TorsoFactory { ...};registeredPartFactories = class HeadFactory { ...};

    そして、抽象レイヤーは次のようにファクトリーを呼び出すことができます:

    class ReptilePartFactory { constructor(type, props) { return new registeredPartFactories(props); }};

    このアプローチははるかにクリーンで、ReptilePartFactory のコードに影響を与えずにファクトリーを拡張できます。 そのため、ファクトリー パターンを使用する前に、本当に必要なものがあるかどうかを確認してください。 同じようなタイプのオブジェクトを繰り返し作成し、作成ロジックにある程度の抽象化を提供しながら、これらのオブジェクトを使用して新しいインスタンスを作成する層が必要な場合、はい – ファクトリ パターンは良い選択肢です。

    コメントを残す

    メールアドレスが公開されることはありません。