デザインパターンについての雑談(16)—抽象的なファクトリーパターン
コラム紹介
カラムアドレス
コラム紹介
主に現在市場に出回っている23種類の一般的なデザインパターンを一つ一つ分析してまとめていますので、興味のある方はぜひご覧ください、また随時更新していきます。皆さんが私を監督し、一緒に学び、進歩できることを願っています。
抽象的な工場パターン
Abstract Factory Pattern は、具体的なクラスを指定せずに、関連するオブジェクトまたは相互依存するオブジェクトのセットの作成をカプセル化する方法を提供する創造的なデザイン パターンです。
構造
抽象的な工場
製品オブジェクトを作成するためのメソッドのセットを宣言します。各メソッドは特定の製品クラスの作成に対応します。
コンクリート工場
抽象ファクトリ インターフェイスを実装し、特定の製品オブジェクトの作成を担当します。
抽象的な製品
製品の共通インターフェイスを宣言し、すべての特定の製品クラスがこのインターフェイスを実装します。
コンクリート製品
抽象的な製品インターフェイスを実装し、特定の製品の属性と動作を定義します。
該当する状況
1
システムは、一連の関連または相互依存する製品オブジェクトを必要とし、それらを均一に作成したいと考えています。
2
システムは特定の製品の作成プロセスを考慮せず、製品のインターフェイスのみを考慮します。
3
システムは、特定の実装を公開せずに製品クラス ライブラリを提供する必要があります。
Javaプログラムの実装
まず、抽象的な製品インターフェイスを定義します。
public interface Shape {
void draw();
}
次に、具体的な製品クラスを定義して、抽象的な製品インターフェイスを実装します。
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
次に、抽象ファクトリ インターフェイスを定義します。
public interface ShapeFactory {
Shape createShape();
}
次に、抽象ファクトリ インターフェイスを実装する具体的なファクトリ クラスを定義します。
public class CircleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
public class RectangleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
最後に、抽象ファクトリー パターンを使用して具体的な製品オブジェクトを作成できます。
public class Main {
public static void main(String[] args) {
ShapeFactory circleFactory = new CircleFactory();
ShapeFactory rectangleFactory = new RectangleFactory();
Shape circle = circleFactory.createShape();
circle.draw();
Shape rectangle = rectangleFactory.createShape();
rectangle.draw();
}
}
出力結果
Inside Circle::draw() method.
Inside Rectangle::draw() method.
プログラム分析
抽象製品インターフェイス Shape と具体製品クラス Circle および Rectangle を定義します。次に、抽象ファクトリ インターフェイス ShapeFactory と具象ファクトリ クラス CircleFactory および RectangleFactory を定義しました。最後に、抽象的なファクトリー パターンを使用して、具体的な製品オブジェクトの Circle と Rectangle を作成しました。
メリットとデメリットの分析
アドバンテージ
1
関連する製品オブジェクトのセットを作成する便利な方法を提供します。これにより、クライアントは特定の製品の作成の詳細を気にする必要がなく、抽象インターフェイスを介して製品を使用するだけで済みます。
2
クライアントは特定の製品カテゴリから切り離されているため、システムの柔軟性と拡張性が向上します。具体的なファクトリ クラスとプロダクト クラスは、クライアント コードに影響を与えることなく簡単に置き換えることができます。
3
オープニングとクロージングの原則に従って、新しい製品ファミリと製品レベル構造を追加するときは、既存のコードを変更することなく、対応する特定のファクトリ クラスと製品クラスを追加するだけで済みます。
欠点がある
1
システムの複雑さが増し、理解が難しくなります。抽象ファクトリ パターンには複数の抽象インターフェイスと具象実装クラスが含まれるため、理解して管理する必要があるクラスとインターフェイスが多数あり、コードが複雑になります。
2
新しい製品レベル構造を追加する必要がある場合、抽象ファクトリ インターフェイスとすべての具象ファクトリ クラスを変更する必要がありますが、これは開始と終了の原則に違反します。
3
製品ファミリー内の製品の種類が多い場合、特定の工場クラスの数が増加し、システムの保守コストが増加します。