blog

抽象ファクトリー・パターンを1つの記事で理解する

抽象ファクトリーパターンは、具体的なクラスを指定することなく、関連または相互依存する一連のオブジェクトを作成するためのインターフェイスを提供します。抽象ファクトリーは、その概念だけでも非常に抽象的です...

May 16, 2020 · 4 min. read
シェア

1.抽象ファクトリーパターンとは

Abstract Factory パターンは、具体的なクラスを指定することなく、関連または相互依存する一連のオブジェクトを作成するためのインターフェイスを提供します。Abstractファクトリーは確かに、その概念だけでも非常に抽象的です。Abstract Factoryパターンを理解する前に、Abstract Factoryが導入した2つの概念、製品ファミリーと製品階層を理解してください。

製品ファミリーは、異なる製品登録構造の機能的に関連する製品のファミリーです。

製品階層、すなわち製品の継承構造。同じ抽象製品を継承または実現する特定の製品は、同じ製品階層に属します。

簡単に言うと、シャオミのスマートホーム関連製品は製品ファミリーを形成し、ファーウェイの製品は別の製品ファミリーを形成し、両者とも独自のテーブルランプを持っており、これが製品階層です。

2.抽象ファクトリーパターンの実装

Abstract Factoryパターンは製品ファミリーと製品階層の概念を設計するため、これら2つの概念を実装する特定のオブジェクトを定義する必要があります:

  • AbstractFactory:製品ファミリーの定義を担当する抽象ファクトリー。
  • ConcreteFactory: 具体的なファクトリーで、実際の製品ファミリーのオブジェクトを生成します。
  • AbstractProduct: 抽象的な製品で、製品の階層構造を定義します。
  • ConcreteProduct:: 具体的な製品で、特定の製品階層オブジェクトの生成を担当します。

I. まず、製品レベルの構造とその具体的なオブジェクトを定義する必要があります。

/*===最初に2つの製品階層を定義する:デスクランプとBluetoothスピーカー===*/
public interface Lamp {
 void open(); 
}
public interface BluetoothSpeaker {
 public void receive();
}
/*===次に、特定のオブジェクトを定義する===*/
public class HuaWeiBluetoothSpeaker implements BluetoothSpeaker {
 @Override
 public void receive() {
 System.out.println("ファーウェイのスピーカーがコマンドを受信する...");
 }
}
public class HuaWeiLamp implements Lamp {
 @Override
 public void open() {
 System.out.println("ファーウェイのデスクライトをつける.");
 } 
}
public class MiBluetoothSpeaker implements BluetoothSpeaker {
 @Override
 public void receive() {
 System.out.println("シャオミのスピーカーがコマンドを受信する...");
 }
}
public class MiLamp implements Lamp {
 @Override
 public void open() {
 System.out.println("シャオミのデスクライトをつける");
 }
}

II.製品階層があれば、製品ファミリーも必要

/*===まず、スーパーファクトリーが製品ファミリーの定義を担当する。===*/
public interface SmartHomeFactory {
 public BluetoothSpeaker productBoothSpeaker();
 public Lamp productLamp();
}
/*===次に、特定のファクトリー・オブジェクトを定義する===*/
public class MiFactory implements SmartHomeFactory {
 @Override
 public BluetoothSpeaker productBoothSpeaker() {
 return new MiBluetoothSpeaker();
 }
 @Override
 public Lamp productLamp() {
 return new MiLamp();
 }
}
public class HuaWeiFactory implements SmartHomeFactory {
 @Override
 public BluetoothSpeaker productBoothSpeaker() {
 return new HuaWeiBluetoothSpeaker();
 }
 @Override
 public Lamp productLamp() {
 return new HuaWeiLamp();
 }
}

第三に、製品ファミリと製品の階層が完了するように、ビジネスプロセスは、直接対応する製品ファミリの関数を呼び出します

public class Test {
 public static void main(String[] args) {
 //ファーウェイのスマートホーム製品ファミリー
 SmartHomeFactory hwshf = new HuaWeiFactory();
 BluetoothSpeaker bs= hwshf.productBoothSpeaker();
 bs.receive();
 Lamp lamp = hwshf.productLamp();
 lamp.open();
 
 //シャオミのスマートホーム製品ファミリー
 SmartHomeFactory mishf = new MiFactory();
 BluetoothSpeaker mibs = mishf.productBoothSpeaker();
 mibs.receive();
 Lamp milamp = mishf.productLamp();
 milamp.open();
 }
}

Abstract Factoryパターンを実装するプロセスを見ると、Abstract Factoryパターンはわずか3ステップで実装されます:

1. まず、商品階層と特定の商品オブジェクトを定義する。
2. スーパーファクトリーを定義し、ファクトリーを通じて製品ファミリーを定義し、特定のファクトリーを通じて、特定の製品ファミリーのオブジェクトを生産する必要がある。
3. 工場を通じて特定の製品オブジェクトの外部生産は、外部は生成の具体的なプロセスを知る必要はない。

3.抽象ファクトリーパターンの実践シナリオ

実際のビジネスでは、システムが複数の製品を持っている場合は、各回のみ、製品ファミリのいずれかを使用し、ビジネスプロセスでは、製品のインスタンスが作成される方法の詳細に依存していない結合し、表現、この時間は、抽象的なファクトリパターンの使用を検討することができます。たとえば、ミレットスマートホームを使用する場合、ミレットスマートスピーカー、ミレットスマートランプまたはミレットファミリーの他の製品の使用の使用をサポートします。

4.抽象ファクトリーパターンの長所と短所

抽象ファクトリーの利点

  1. オブジェクト作成の詳細を分離するため、クライアントはオブジェクト作成プロセスについて知る必要がありません。
  2. 製品ファミリーの複数のオブジェクトは一緒にバインドされ、クライアントは常に同じ製品ファミリーの製品を使用します。
  3. 製品系列を増やす時、拡大するのは簡単で、製品レベルを実現する具体的な対象を増やすだけでよく、それから実際の生産工場を追加し、元の論理を変更する必要はなく、開閉の原則に沿います。

抽象ファクトリーの欠点

  1. 商品階層を拡張することは不便で、元の定義ロジックを変更する必要があり、開閉の原則に沿うものではありません。

小さな出来事を読んで

この内容が少しでも役に立ったり、刺激になったりしたなら、親指の小指を動かしてみてください:

  1. 他の記事にも刺激を受けるかどうか、公開サイトをこっそり覗いてみてください。
Read next