Javaにおける23のデザインパターン【創造型パターン】の【ファクトリパターン】


文書ディレクトリ
  • 設計モード分類
  • ファクトリモード
  • 工場モード分類:
  • 単純工場モード工場方法モード比較
  • 単純ファクトリモード
  • 要点
  • コード
  • 工場方法モード
  • 要点:
  • コード
  • アプリケーション:

  • 抽象工場モード
  • 要点
  • コード
  • まとめ
  • デザインパターン分類
  • 作成モード
  • 単例モード、工場モード、抽象工場モード、建設者モード、プロトタイプモード
  • 注目オブジェクトの作成プロセス
  • 構造型モード
  • アダプタモード、ブリッジモード、装飾モード、コンビネーションモード、外観モード、メタモード、プロキシモード
  • 注目オブジェクトとクラスの組織
  • 動作モード
  • テンプレートメソッドモード、コマンドモード、反復器モード、オブザーバモード、仲介モード、メモモード、解釈器モード、ステータスモード、ポリシーモード、責任チェーンモード、訪問者モード
  • .
  • システムとオブジェクトとの相互作用に注目し、システムの実行時オブジェクト間の相互通信と協力を研究し、オブジェクトの職責
  • をさらに明確にする.

    工場モード
  • は、作成者と呼び出し者の分離
  • を実現した.
  • 詳細分類:
  • 単純ファクトリモード(最も一般的)
  • 工場方法モード
  • 抽象工場モード
  • オブジェクト向け設計の基本原則
  • OCP(開閉原則、Open-Closed Principle):ソフトウェアのエンティティは拡張に対して開放され、修正に対して
  • を閉じるべきである.
  • DIP(依存逆転原則、Dependence Inversion Principle):インタフェースに対してプログラミングするには、実装に対してプログラミングしないでください.
  • LoD(ディミットの法則、Law of Demeter):見知らぬ人との通信を避けるために、直接の友达と通信するだけです.
  • コア本質
  • オブジェクトをインスタンス化し、new操作
  • の代わりにファクトリメソッドを用いる.
  • では、実装クラスが選択され、オブジェクトの統合管理と制御が作成されます.呼び出し者を我々の実装クラスとデカップリングする

  • 工場モデル分類:
  • 単純ファクトリモード
  • は、同じ階層内の任意の製品を生産するために使用される.(新しい製品を追加するには、既存のコードを変更する必要があります)
  • ファクトリメソッドモード
  • は、同じ等級構造の固定製品を製造するために使用される.(任意の製品の追加をサポート)
  • 抽象ファクトリモード
  • は、異なる製品ファミリーのすべての製品を生産するために使用される.(新しい製品を追加するには、何もできません.製品ファミリーの追加をサポートします)

  • 単純ファクトリモードとファクトリメソッドモードの比較
  • 構造の複雑さ
  • この角度から比較すると、明らかに単純な工場モデルが優れている.単純な工場モデルは1つの工場クラスしか必要としないが、工場方法モデルの工場クラスは製品クラスの個数が増加するにつれて増加し、これは間違いなくクラスの個数をますます多くし、構造の複雑さを増加させる.

  • コード複雑度(単純ファクトリモード複雑)
  • コードの複雑さと構造の複雑さは矛盾しており、単純な工場モードが構造の面で比較的簡潔である以上、コードの面では工場方法モードよりも複雑であるに違いない.単純ファクトリモードのファクトリクラスは、製品クラスの増加に伴って多くの方法(またはコード)を増加させる必要があるが、ファクトリメソッドモードの各特定のファクトリクラスは単一のタスクのみを完了し、コードは簡潔である.
  • クライアントプログラミングの難易度(単純な工場で簡単)
  • ファクトリメソッドモードは、ファクトリクラス構造にインタフェースを導入してOCPを満たすが、クライアント符号化にはファクトリクラスをインスタンス化する必要がある.単純なファクトリモードのファクトリクラスは静的クラスであり、クライアントでインスタンス化する必要はありません.これは間違いなく魅力的な利点です.
  • 管理上の難易度
  • 拡張性の観点:両者は同様に良好な拡張性を備えているが、単純な工場モードはOCP
  • を完全に満たしていない.
  • メンテナンスの観点:複数の製品クラスを修正する必要がある場合、工場クラスの修正はかなり面倒になります.逆に単純な工場モデルは唯一の工場クラスを変更するだけ(どうしても要求を満たすように変更できるでしょう?このクラスを書き直すことはできません)
  • 推奨事項:
  • 設計理論に基づいて提案:工場方法モデル
  • 実際の開発:一般的に単純工場モデル
  • を使用する

    単純ファクトリモード
    要点
  • 単純ファクトリモードは静的ファクトリモードとも呼ばれる.なぜなら、ファクトリクラスは一般的に静的メソッドを使用し、受信パラメータの違いによって異なるオブジェクトインスタンス
  • を返すからである.
  • 新製品の追加にはどうしようもなく、コードを修正できなければ拡張できない
  • です.
    コード#コード#
  • インタフェース
    public interface Car {
           
    	void run();
    
    }
    
  • 特定のクラス(Audi,Byd)
    //Audi 
    package simplefactory;
    
    public class Audi implements Car{
           
    
    	@Override
    	public void run() {
           
    
    		System.out.println("    ");
    	}
    
    }
    //-----------------------------------------------------------------
    //Byd 
    package simplefactory;
    
    public class Byd implements Car{
           
    
    	@Override
    	public void run() {
           
    
    		System.out.println("     ");
    	}
    
    }
    
    
  • 工場類書き方一:
    package simplefactory;
    
    public class CarFactory {
           
    
    	public static Car creatCar(String type) {
           
    		if("  ".equals(type)) {
           
    			return new Audi();
    		}else if("   ".equals(type)) {
           
    			return new Byd();
    		}else {
           
    			return null;
    		}
    	}
    }
    
    
  • 工場類書き方二
    package simplefactory;
    
    public class CarFactory2 {
           
    
    	public static Car createAudi() {
           
    		return new Audi();
    	}
    	public static Car createByd() {
           
    		return new Byd();
    	}
    }
    
    
  • 工場類書き方三:
    package simplefactory;
    
    public class CarFactory3 {
           
    
    	public static Car createCar(String type) {
           
    		Car c = null;
    		if("  ".equals(type)) {
           
    			c = new Audi();
    		}else if("   ".equals(type)) {
           
    			c = new Byd();
    		}
    		
    		return c;
    	}
    }
    
    
  • 呼び出し者:
    package simplefactory;
    //      
    public class Client02 {
           
    
    	public static void main(String[] args) {
           
    		Car c1 = CarFactory.creatCar("  ");
    		Car c2 = CarFactory.creatCar("   ");
    		 
    		c1.run();
    		c2.run();
    		
    	}
    }
    
    
  • ファクトリメソッドモード
    要点:
  • 単純ファクトリモードの欠点を回避するために、OCP
  • を完全に満たす
  • ファクトリメソッドモードと単純ファクトリモードの最大の違いは、単純ファクトリモードが1つ(プロジェクトまたは独立モジュールの場合)のファクトリクラスのみであり、ファクトリメソッドモードには同じインタフェースを実現するファクトリクラス
  • のセットがあることである.
    コード#コード#
  • 自動車インタフェースと工場インタフェース
    //    ,      
    package factorymethod;
    
    public interface Car {
           
    	void run();
    
    }
    
    //    ,    
    package factorymethod;
    
    public interface CarFactory {
           
    
    	Car createCar();
    }
    
    
    
  • 自動車類と工場類
    //   
    package factorymethod;
    
    public class Audi implements Car{
           
    
    	@Override
    	public void run() {
           
    
    		System.out.println("    ");
    	}
    
    }
    
    //        
    package factorymethod;
    
    public class AudiFactory implements CarFactory{
           
    
    	@Override
    	public Car createCar() {
           
    		return new Audi();
    	}
    
    }
    
    
  • 呼び出し者
    package factorymethod;
    
    public class Client {
           
    	public static void main(String[] args) {
           
    		Car c1 = new AudiFactory().createCar();//          
    		c1.run();
    	}
    
    }
    
    
    
  • 適用:
    新しいものを追加するたびに、そのもののクラスと、そのオブジェクトを作成できるファクトリクラスを作成します.
    呼び出し者は、対応するファクトリを介して対応するオブジェクトを作成します.
    抽象ファクトリモード
    要点
  • は、異なる製品ファミリーのすべての製品を生産するために使用される.(新しい製品を追加するには、何もできません.製品ファミリーの追加をサポートします)
  • 抽象工場モデルは工場メソッドモデルのアップグレードバージョンであり、複数の業務品種、業務分類がある場合、抽象工場モデルによる生産に必要な対象は非常に良い解決方法である.
    エンジン
    シート
    タイヤ
    ——』一つの製品ファミリー
    ハイエンドエンジン
    ハイサイドシート
    ハイサイドタイヤ
    ローエンドエンジン
    ローエンドシート
    ローエンドタイヤ

  • コード#コード#
    製品ファミリーの各製品には、次のものがあります.
  • 抽象クラス(プロダクトモジュール)
  • 製品実現類(具体的な実現)
  • 工場:
  • 抽象ファクトリクラス(ファクトリが製品を作成するルール)
  • 工場実現類(規則に従って具体的に製品を生産する)
  • 呼び出し元:
  • 工場インタフェースを介して必要な工場を作成する
  • は、対応する製品インタフェースを介して、作成する工場で製品
  • を生産する.
  • エンジン抽象クラスと実装クラス
    //      
    package abstractFactory;
    
    public interface Engine {
           
    
    	void run();
    	void start();
    }
    
    //       (LuxuryEngine     ,LowEngine     )
    class LuxuryEngine implements Engine{
           
    
    	@Override
    	public void run() {
           
    		System.out.println("    ,   ");
    	}
    
    	@Override
    	public void start() {
           
    		System.out.println("    ,   !      ");
    	}
    	
    }
    class LowEngine implements Engine{
           
    	
    	@Override
    	public void run() {
           
    		System.out.println("       ");
    	}
    	
    	@Override
    	public void start() {
           
    		System.out.println("  ,   !       ");
    	}
    	
    }
    
    
    
  • シート抽象クラスと実装クラス
    //     
    package abstractFactory;
    
    public interface Seat {
           
    	
    	void massage();
    	
    }
    
    //     (LuxurySet    ,LowSeat    )
    class LuxurySeat implements Seat{
           
    
    	@Override
    	public void massage() {
           
    		System.out.println("  ,      ");
    	}
    	
    }
    class LowSeat implements Seat{
           
    	
    	@Override
    	public void massage() {
           
    		System.out.println("  ,       ");
    	}
    	
    }
    
    
    
  • タイヤ抽象クラスと実装クラス
    //     
    package abstractFactory;
    
    public interface Tyre {
           
    
    	void revolve();
    }
    
    //      (LuxuryTyre    ,LowTyre    )
    class LuxuryTyre implements Tyre{
           
    
    	@Override
    	public void revolve() {
           
    		System.out.println("  ,     ");
    	}
    
    
    	
    }
    class LowTyre implements Tyre{
           
    
    	@Override
    	public void revolve() {
           
    		System.out.println("  ,    ");
    	}
    	
    	
    	
    }
    
    
    
  • 工場抽象類
    package abstractFactory;
    
    public interface CarFactory {
           
    	Engine createEngine();
    	Seat createSeat();
    	Tyre createTyre();
    
    }
    
    
    
  • 工場実現類(ハイエンド工場とローエンド工場)
    //       
    package abstractFactory;
    
    public class LuxuryCarFactory implements CarFactory{
           
    
    	@Override
    	public Engine createEngine() {
           
    		return new LuxuryEngine();
    	}
    
    	@Override
    	public Seat createSeat() {
           
    		return new LuxurySeat();
    	}
    
    	@Override
    	public Tyre createTyre() {
           
    		return new LuxuryTyre();
    	}
    
    }
    
    //       
    package abstractFactory;
    
    public class LowCarFactory implements CarFactory{
           
    
    	@Override
    	public Engine createEngine() {
           
    		return new LowEngine();
    	}
    
    	@Override
    	public Seat createSeat() {
           
    		return new LowSeat();
    	}
    
    	@Override
    	public Tyre createTyre() {
           
    		return new LowTyre();
    	}
    
    }
    
    
    
  • クライアント:
    package abstractFactory;
    
    public class Client {
           
    
    	public static void main(String[] args) {
           
    		CarFactory factory = new LuxuryCarFactory();
    		Engine e = factory.createEngine();
    		e.run();
    		e.start();
    	}
    }
    //  ————————————————————————————————————————————————————————————
        ,   
        ,   !      
    
    
  • まとめ
  • 工場モデルのポイント:
  • 単純ファクトリモード(静的ファクトリモード)
  • はある程度設計原則に合致しないが、実際に使用するのは最大
  • である.
  • ファクトリメソッドモード
  • 既存のクラスを変更することなく、新たなファクトリクラスを追加することで
  • の拡張を実現する.
  • 抽象ファクトリモード
  • 製品を増やすことはできません.製品族
  • を増やすことができます.

  • 適用シーン
  • JDKにおけるCalendarのgetInstanceメソッド
  • JDBCにおけるConnectionオブジェクトの取得
  • HibernateでSessionFactory作成Session
  • springにおけるIOCコンテナ作成管理beanオブジェクト
  • XML解析時のDocumentBuilderFactory作成解析器
  • 反射中のClassオブジェクトのnewInstance()