JAvaにおける抽象工場モデルの概要
2601 ワード
抽象ファクトリモード
抽象ファクトリモード(Abstract Factory Pattern)は、スーパーファクトリを中心に他のファクトリを作成します.このスーパー工場は他の工場の工場とも呼ばれている.このタイプの設計モードは、オブジェクトを作成するための最適な方法を提供する作成モードに属します.
抽象ファクトリモードでは、インタフェースは関連オブジェクトを作成するファクトリであり、クラスを明示的に指定する必要はありません.生成された各ファクトリは、ファクトリモードに従ってオブジェクトを提供できます.
概要:特定のクラスを指定することなく、関連オブジェクトまたは相互依存オブジェクトの一連を作成するインタフェースを提供します.
主な解決:主にインタフェースの選択の問題を解決します.
いつ使用するか:システムの製品には1つ以上の製品ファミリーがあり、システムはそのうちの1つの製品しか消費しません.
解決方法:1つのプロダクトファミリーで、複数のプロダクトを定義します.
キーコード:1つの工場で複数の同類製品を集約します.
応用例:仕事をして、いくつかのパーティーに参加するために、きっと2セット以上の服があるでしょう.例えば、ビジネス服(セット、一連の具体的な製品)、ファッション服(セット、一連の具体的な製品)、さらには1つの家庭にとって、ビジネス婦人服、ビジネス男性服、ファッション婦人服、ファッション男性服があるかもしれません.これらもセットです.すなわち、一連の具体的な製品です.ある状況(現実には存在しない、そうでなければ共産主義に入ることはできないが、抽象的な工場モデルを説明するのに役立つ)を仮定すると、あなたの家では、あるたんす(具体的な工場)にこのような服(セット、一連の具体的な製品)しか保管できず、このようなセットの服を持つたびに自然にこのたんすから取り出さなければならない.OOの思想で理解して、すべてのたんす(具体的な工场)はすべてたんす类の(抽象的な工场)のある1つで、すべてのセットの服はまた具体的な上着(ある具体的な制品)、ズボン(ある具体的な制品)を含んで、これらの具体的な上着も実はすべて上着(抽象的な制品)、具体的なズボンもすべてズボン(别の抽象的な制品)です.
利点:1つのプロダクトファミリー内の複数のオブジェクトが一緒に動作するように設計されている場合、クライアントは常に同じプロダクトファミリー内のオブジェクトのみを使用することを保証します.
欠点:製品ファミリーの拡張は非常に困難で、シリーズのある製品を増やすには、抽象的なCreatorにコードを追加するだけでなく、具体的な中にコードを追加する必要があります.
使用シーン:1、QQは皮膚を交換して、1セットは一緒に交換します.2、異なるオペレーティングシステムのプログラムを生成する.
注意事項:製品ファミリーは拡張しにくく、製品レベルは拡張しやすい.
インプリメンテーション
ShapeとColorインタフェースを作成し、これらのインタフェースを実装するエンティティクラスを作成します.次に、抽象ファクトリクラスAbstractFactoryを作成します.次に、AbstractFactoryを拡張したファクトリクラスShapeFactoryとColorFactoryを定義します.次に、ファクトリジェネレータ/ジェネレータクラスFactoryProducerを作成します.
AbstractFactoryPatternDemoでは、プレゼンテーションクラスでFactoryProducerを使用してAbstractFactoryオブジェクトを取得します.AbstractFactoryに形状情報Shape(CIRCLE/RECTANGLE/SQUARE)を渡し、必要なオブジェクトのタイプを取得します.また、AbstractFactoryに色情報Color(RED/GREEN/BLUE)を渡し、必要なオブジェクトのタイプを取得します.
1.Shape(シェイプ)インタフェースの構築
2.Rectangle(長方形)インタフェース実装クラスの構築
3.Circle(円)インタフェース実装クラスの構築
4.Square(正方形)インタフェース実装クラスの構築
抽象ファクトリモード(Abstract Factory Pattern)は、スーパーファクトリを中心に他のファクトリを作成します.このスーパー工場は他の工場の工場とも呼ばれている.このタイプの設計モードは、オブジェクトを作成するための最適な方法を提供する作成モードに属します.
抽象ファクトリモードでは、インタフェースは関連オブジェクトを作成するファクトリであり、クラスを明示的に指定する必要はありません.生成された各ファクトリは、ファクトリモードに従ってオブジェクトを提供できます.
概要:特定のクラスを指定することなく、関連オブジェクトまたは相互依存オブジェクトの一連を作成するインタフェースを提供します.
主な解決:主にインタフェースの選択の問題を解決します.
いつ使用するか:システムの製品には1つ以上の製品ファミリーがあり、システムはそのうちの1つの製品しか消費しません.
解決方法:1つのプロダクトファミリーで、複数のプロダクトを定義します.
キーコード:1つの工場で複数の同類製品を集約します.
応用例:仕事をして、いくつかのパーティーに参加するために、きっと2セット以上の服があるでしょう.例えば、ビジネス服(セット、一連の具体的な製品)、ファッション服(セット、一連の具体的な製品)、さらには1つの家庭にとって、ビジネス婦人服、ビジネス男性服、ファッション婦人服、ファッション男性服があるかもしれません.これらもセットです.すなわち、一連の具体的な製品です.ある状況(現実には存在しない、そうでなければ共産主義に入ることはできないが、抽象的な工場モデルを説明するのに役立つ)を仮定すると、あなたの家では、あるたんす(具体的な工場)にこのような服(セット、一連の具体的な製品)しか保管できず、このようなセットの服を持つたびに自然にこのたんすから取り出さなければならない.OOの思想で理解して、すべてのたんす(具体的な工场)はすべてたんす类の(抽象的な工场)のある1つで、すべてのセットの服はまた具体的な上着(ある具体的な制品)、ズボン(ある具体的な制品)を含んで、これらの具体的な上着も実はすべて上着(抽象的な制品)、具体的なズボンもすべてズボン(别の抽象的な制品)です.
利点:1つのプロダクトファミリー内の複数のオブジェクトが一緒に動作するように設計されている場合、クライアントは常に同じプロダクトファミリー内のオブジェクトのみを使用することを保証します.
欠点:製品ファミリーの拡張は非常に困難で、シリーズのある製品を増やすには、抽象的なCreatorにコードを追加するだけでなく、具体的な中にコードを追加する必要があります.
使用シーン:1、QQは皮膚を交換して、1セットは一緒に交換します.2、異なるオペレーティングシステムのプログラムを生成する.
注意事項:製品ファミリーは拡張しにくく、製品レベルは拡張しやすい.
インプリメンテーション
ShapeとColorインタフェースを作成し、これらのインタフェースを実装するエンティティクラスを作成します.次に、抽象ファクトリクラスAbstractFactoryを作成します.次に、AbstractFactoryを拡張したファクトリクラスShapeFactoryとColorFactoryを定義します.次に、ファクトリジェネレータ/ジェネレータクラスFactoryProducerを作成します.
AbstractFactoryPatternDemoでは、プレゼンテーションクラスでFactoryProducerを使用してAbstractFactoryオブジェクトを取得します.AbstractFactoryに形状情報Shape(CIRCLE/RECTANGLE/SQUARE)を渡し、必要なオブジェクトのタイプを取得します.また、AbstractFactoryに色情報Color(RED/GREEN/BLUE)を渡し、必要なオブジェクトのタイプを取得します.
1.Shape(シェイプ)インタフェースの構築
package com.zlp.creational.abstracts;
public interface Shape {
void draw();
}
2.Rectangle(長方形)インタフェース実装クラスの構築
package com.zlp.creational.abstracts;
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
3.Circle(円)インタフェース実装クラスの構築
package com.zlp.creational.abstracts;
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
4.Square(正方形)インタフェース実装クラスの構築
package com.zlp.creational.abstracts;
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}