デザインパターン
ファクトリーメソッドパターン
抽象的製品カテゴリー
広く流通している果物の種類を例にとると、果物の一般的な特徴は色と名前であり、一般的な特徴であるため、果物はこの場合インターフェースとなります。
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();
}
}
ゆうせい
シンプルな作成、明確な構造、わかりやすさ
デザインパターンの禅