blog

デザイン・パターンの禅 - ファクトリー・メソッド・パターン

最初のステップは、オブジェクトを作るためのインターフェースを定義することです。 人気のある種類の果物を例にとると、色と名前という一般的な特徴を持っており、一般的な特徴であるため、ここでは果物がインター...

Jan 26, 2021 · 4 min. read
シェア

デザインパターン

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

抽象的製品カテゴリー

広く流通している果物の種類を例にとると、果物の一般的な特徴は色と名前であり、一般的な特徴であるため、果物はこの場合インターフェースとなります。

public interface Fruit {
 void getFruitName();
 void getFruitColor();
}

処理を簡単にするため、ここではリンゴとバナナの2種類のみを取り上げ、それぞれに果物のインターフェースを実装しています。

public class Banana implements Fruit {
 @Override
 public void getFruitName() {
 System.out.println("this is banana");
 }
 @Override
 public void getFruitColor() {
 System.out.println("this is yellow");
 }
}
public class Apple implements Fruit{
 @Override
 public void getFruitName() {
 System.out.println("this is apple");
 }
 @Override
 public void getFruitColor() {
 System.out.println("this is red");
 }
}

抽象ファクトリーの作成

果物のインターフェイスができたので、次は果物を育てましょう。どんな果物を育てるかについては、ここでは心配する必要はありません。

public abstract class AbsCreateFruit {
 public abstract <T extends Fruit> T createFruit(Class<T> c);
}

抽象的なインターフェイスを定義し、サブクラスによって実装される果実を育てるための抽象的なメソッドを追加します。

工場の実現

public class CreateFruit extends AbsCreateFruit {
 Fruit fruit = null;
 @Override
 public <T extends Fruit> T createFruit(Class<T> c) {
 try {
 fruit = (Fruit) Class.forName(c.getName()).newInstance();
 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
 e.printStackTrace();
 }
 return (T)fruit;
 }
}

反射を利用して、植えるべき果実を手に入れ、果実の作成を完了します。

最終的な実現

public class GrowFruit {
 public static void main(String[] args) {
 CreateFruit createFruit = new CreateFruit();
 Fruit apple = createFruit.createFruit(Apple.class);
 apple.getFruitColor();
 apple.getFruitName();
 Fruit banana = createFruit.createFruit(Banana.class);
 banana.getFruitName();
 banana.getFruitColor();
 }
}

一般的なクラス図は、Zen of Design Patterns に記載されています。

  • 製品:製品の公共特性を定義する責任者。
  • ConcreteProduct 製品固有
  • Create : 抽象ファクトリーとも呼ばれる抽象作成クラス。
  • ConcreateCreator : 具象実装クラス

Factoryメソッドパターンの利点

I. 適切なカプセル化と明確な構成

特定の製品を作成する必要がある場合、製品クラスの名前だけを知っていればよく、モジュール間の結合を減らすことができます。

第二に、優れた拡張性

新しい果物の品種を追加する必要がある場合は、新しい実装クラスを追加するだけでよく、ファクトリークラスそのものは修正の対象にはなりません。これは、修正に対しては閉じ、追加に対しては発展させるという原則に沿ったものです。

III.シールド製品カテゴリー

呼び出し側は、製品クラスの実装がどのように変わるかを気にする必要はなく、製品のインターフェースだけを気にすればよいのです。

シンプルなファクトリーパターン

ファクトリパターンとの最初の接触では、最初の時間は、おそらく単純なファクトリパターンを参照してください、ファクトリパターンは、クラスの抽象的な作成を削除するには、上記のフレームワークに基づいて、メソッドの使用は、コードのロジックを簡素化するが、拡張の難しさの問題があり、オープンとクローズの原則に準拠していません。

実装クラスとシナリオクラスは以下のように変更されます。

public class CreateFruit {
 public static <T extends Fruit> T createFruit(Class<T> c) {
 Fruit fruit = null;
 try {
 fruit = (Fruit) Class.forName(c.getName()).newInstance();
 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
 e.printStackTrace();
 }
 return (T)fruit;
 }
}
public class GrowFruit {
 public static void main(String[] args) {
 Fruit apple = CreateFruit.createFruit(Apple.class);
 apple.getFruitColor();
 apple.getFruitName();
 Fruit banana = CreateFruit.createFruit(Banana.class);
 banana.getFruitName();
 banana.getFruitColor();
 }
}

マルチファクトリークラス

各具体的な商品クラスはクリエイターに対応し、各クリエイターは、単一の責任に沿って、対応する商品オブジェクトを作成するための独立した責任を負うことになります。

したがって、果物の抽象クラスは次のように変更できます。

public abstract class AbsCreateFruit {
 public abstract Fruit createFruit();
}

工場の実現

public class AppCreateFruit extends AbsCreateFruit {
 @Override
 public Fruit createFruit() {
 return new Apple();
 }
}

ファイナルコール

public class GrowFruit {
 public static void main(String[] args) {
 Fruit apple = new AppCreateFruit().createFruit();
 apple.getFruitColor();
 apple.getFruitName();
 }
}

ゆうせい

シンプルな作成、明確な構造、わかりやすさ

デザインパターンの禅

Read next

金融業界は、どのように正確な顧客獲得、リアルタイムの訪問者の遮断のためのオペレータビッグデータを使用する

クラウドネットワーク顧客オペレータービッグデータ精密マーケティング顧客サービスプロジェクトは、企業が低コスト、高効率のビジネスチャンスを達成するために、企業が顧客の正確なソースと正確なリーチの最後のキロメートルをタップするのに役立ちます。 オフラインの金融機関であれ、オンラインの金融機関であれ、現在、集客の方法はオフラインのプロモーションやメディア広告だけに頼らず、むしろウェブプロモーションや入札プロモーション、多面的な集客資源に目を向けます。 しかし、...

Jan 26, 2021 · 2 min read