[設計モード]工場方法
Factory Method
背景
ファクトリメソッドは、親クラスでオブジェクトを作成するインタフェースを提供する設計モードの1つです.サブクラスは、オブジェクトの作成時にシェイプを変換できます.
💀 問題の定義
物流管理アプリケーションの作成を想定します.アプリケーションの最初のバージョンはトラック輸送のみに関連するため、アプリケーションのコードはTruckクラスにあります.
やがてこのアプリが有名になり、多くの人が海運会社に海運支援を求めた.
Truckクラスに既に密接に関連付けられているコードにShipsを追加して変更するのは容易ではありません.
拡張性の悪いコードに問題があります.
😊 ソリューション
この場合,工場メソッド設計モードでは,newによってオブジェクトを生成する部分の代わりに特殊な工場メソッドを呼び出すことを提案する.すなわち,オブジェクトはファクトリメソッドでnewによって作成される.ファクトリメソッドによって生成されるオブジェクトを製品と呼ぶ.
効果:ファクトリメソッドで、サブクラスで作成したオブジェクトのタイプを変更できます.Logistics l=new RoadLogistics(); or new SeaLogistics();
Transtport t=l.createTransport();
t.deliver()
Logistics l=new RoadLogistics(); or new SeaLogistics();
Transtport t=l.createTransport();
t.deliver()
各
🧱 こうぞう
工場の方法で作られた製品部分.工場メソッドに基づいて作成されたすべてのオブジェクトに適したフィーチャーに基づいて、製品インタフェースを定義します.
「秘密製品」は、それぞれの製品インタフェースを実装しています.
Creatorクラス宣言Productオブジェクトを作成するファクトリメソッド.メソッドの戻りタイプが製品と一致することが重要です.
ファクトリメソッドを抽象化し,Creatorのサブクラスにそれぞれのバージョンでメソッドを実装させることもできる.あるいはbasefactoryメソッドがデバッガバージョンを返すのも方法です.
Creatorの名前を見て誤解すべきではないのは、製品の作成がCreatorのライフサイクル機能ではないことです.通常、Creatorクラスには、既存の製品に関連するコアビジネスロジックがあります.ファクトリ・メソッドを使用すると、このロジックを機密製品から分離できます.
Concrete CreatorsはCreatorクラスの基本ファクトリメソッドを継承し、他のタイプの製品を返します.
🙋 いつ使いますか。
ビジネスロジックを書き直すたびにシステムリソースを節約するのではなく、既存のオブジェクトを再使用します.
既存のオブジェクトを再使用するプロセス
1.作成したすべてのオブジェクトを追跡するリポジトリを作成
2.誰かがオブジェクトを要求した場合、プログラムはpoolでfree objectを検索します.
3. return
4.ない場合はnewでpoolを作成または登録する
このロジックはクラスの作成者部分に配置するのに適していますが、作成者はnew objectsを返さなければなりません.既存のオブジェクトを返すことができません.
したがって、ファクトリメソッドを使用して、この2つのメソッドを作成/再使用できます.
コードに関連付けられたオブジェクトの正確なタイプ、関連付け、依存関係は予め知られていない.
ライブラリまたはフレームワーク内のユーザーに内部コンポーネントを拡張する方法を提供します.
🔪 メリットとデメリット
1.メリット
2.短所
📝 例
Shape.java
public interface Shape{
void draw();
}
Circle.javapublic class Circle implements Shape{
@Override
public void draw(){
System.out.println("Inside Circle::draw() method.");
}
}
Rectangle.javapublic class Circle implements Shape{
@Override
public void draw(){
System.out.println("Inside Rectangle::draw() method.");
}
}
Square.javapublic class Circle implements Shape{
@Override
public void draw(){
System.out.println("Inside Square::draw() method.");
}
}
ShapeFactory.javapublic class ShapeFactory{
public Shape getShape(String shapeType){
if(shapeType==null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
FactoryPatternDemo.javapublic class FactoryPatternDemo{
public static void main(String[] args){
ShapeFactory shapeFactory=new ShapeFactory();
Shape shape1=shapeFactory.getShape("CIRCLE");
shape1.draw();
Shape shape2=shapeFactory.getShape("RECTANGLE");
shape1.draw();
Shape shape3=shapeFactory.getShape("SQUAREa");
shape1.draw();
}
}
リファレンス
Refactoring Guru
サンプルコード
Reference
この問題について([設計モード]工場方法), 我々は、より多くの情報をここで見つけました https://velog.io/@julie0005/디자인패턴-팩토리-메소드テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol