序章:
Javaで最も使用されているデザインパターンの1つ。
作成モードに属します。オブジェクトを作成するための最適な方法を提供します。
ファクトリパターンでは、オブジェクトを作成しても作成ロジックはクライアントに公開されず、共通のインターフェイスを使用して新しく作成されたオブジェクトを指します。
目的:オブジェクトを作成するためのインターフェースを定義し、そのサブクラスにインスタンス化するファクトリクラスを決定させます。ファクトリパターンは、作成をサブクラスに延期します。
問題の解決:インターフェース選択の問題
使用する場合:異なる条件下で異なるインスタンスを作成することを明示的に計画する場合
解決方法:そのサブクラスにファクトリインターフェイスを実装させ、抽象的な製品を返します
キーコード:
class Factory{
接口 get接口(参数){
if(参数 is a){
return new A();
}else if...
}
}
例:車が必要な場合は、車の製造方法に関係なく、工場から直接受け取ることができます
アドバンテージ:
①発信者がオブジェクトを作成したい場合は、名前を知っていれば十分です。
②製品を追加したい場合のスケーラビリティが高い。ファクトリクラスを拡張するだけです。
③製品の特定の実装を保護し、発信者は製品のインターフェースのみを気にします
欠点:
製品を追加するたびに、特定のクラスとオブジェクトの実装ファクトリを追加する必要があります。これにより、システム内のクラスの数が2倍になり、システムの複雑さがある程度増加し、特定のクラスの依存関係も増加します。システム。
使用するシーン:
①ログレコーダー:ローカルハードディスク、システム時刻、リモートサーバーなどに記録できます。ユーザーはログの記録場所を選択できます。
②データベースアクセス:システムが最後に使用するデータベースの種類だけでなく、データベースが変更される可能性がある場合。
③サーバーに接続するためのフレームワークを設計するには、「POP3」、「IMAP」、「HTTP」の3つのプロトコルが必要です。これら3つのプロトコルを製品クラスとして使用して、インターフェースを共同で実装できます。
予防:
ファクトリメソッドパターンは、複雑なオブジェクトを生成する必要がある場所ならどこでも使用できます。
ただし、単純なオブジェクト、特にnewでのみ作成できるオブジェクトは、ファクトリパターンを使用する必要はありません。
============================
コード:
Shapeインターフェースを作成します。
public interface shape {
void draw();
}
Shapeインターフェースを実装する実装クラス:
public class Rectangle implements shape {
@Override
public void draw() {
System.out.println("rectangle draw");
}
}
public class Circle implements shape{
@Override
public void draw() {
System.out.println("circle draw");
}
}
public class Squre implements shape{
@Override
public void draw() {
System.out.println("square draw");
}
}
与えられた情報に基づいてエンティティクラスオブジェクトを生成するファクトリを作成します
public class ShapeFatory {
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 Squre();
}
return null;
}
}
public class FactoryPatternDemo {
public static void main(String[] args) {
//创建一个工厂
ShapeFatory shapeFatory=new ShapeFatory();
//获取Circle对象
shape shape1=shapeFatory.getShape("circle");
shape1.draw();
//获取Rectangle对象
shape shape2=shapeFatory.getShape("rectangle");
shape2.draw();
//获取squre对象
shape shape3=shapeFatory.getShape("square");
shape3.draw();
}
}