Java設計モードシリーズ-ファクトリメソッドモード

3947 ワード

オリジナル文章、転載は出典を表示してください:《Java設計モードシリーズ-工場方法モード》
一、概説
工場は、製品を生産する場所です.
Java設計モードで工場の概念を使うのは,オブジェクトを生成する場所である.
直接作成できるオブジェクトがなぜファクトリクラスを追加するのか.
これは工場の方法が解決しなければならない問題を理解する必要があります.もし1つのクラスがあれば、私たちは直接newの1つのオブジェクトで仕事をします.これは最も簡単です.しかし、複数のクラスがあり、これらのクラスが異なる場合に異なるオブジェクトを作成する必要がある場合は、ファクトリが必要です.ファクトリで条件に基づいて具体的なオブジェクトを作成することができます.
これにより、呼び出し元と特定のターゲットクラスがデカップリングされ、呼び出し元はそのオブジェクトを作成する必要があることを全く知らず、条件を提示しただけで、工場は与えられた条件に基づいてどのオブジェクトを作成するかを決定することができます.
二、簡単な工場方法モデル
工場メソッドモデルといえば、23種類の設計モデルの内容ではない単純なエンジニアリングメソッドモデルを理解しなければならない.
単純ファクトリメソッドモデルとは,ターゲットクラスに1つのファクトリを作成し,複数のターゲットが実装されると,このファクトリ内部で論理判断を行い条件に応じて異なるターゲットインスタンスを作成することである.
次に例を見て、テーブルを例に書きます.
テーブルインタフェース:Desk
/**
 *     
 */
public interface Desk {
    String getType();
}

木製テーブル:WoodenDesk
/**
 *     
 */
public class WoodenDesk implements Desk{
    private String type = "   ";
    @Override
    public String getType() {
        return type;
    }
}

プラスチックテーブル:PlasticDesk
/**
 *    
 */
public class PlasticDesk implements Desk {
    private String type = "   ";
    @Override
    public String getType() {
        return type;
    }
}

タイプ列挙:Type
/**
 *   
 */
public enum Type {
    PLASTIC,WOODEN;
}

テーブル工場:DeskFactory
/**
 *     
 */
public class DeskFactory {
    public static Desk createDesk(Type type) {
        switch (type) {
            case WOODEN:
                return new WoodenDesk();
            case PLASTIC:
                return new PlasticDesk();
            default:
                return null;
        }
    }
}

テストクラス:Clienter
/**
 *    
 */
public class Clineter {
    public static void main(String[] args) {
        Desk desk = DeskFactory.createDesk(Type.PLASTIC);
        System.out.println(desk.getType());
    }
}

実行結果
   

これが単純な工場法であり,複数の目標に向けて実現する工場クラスは1つしかない.目標の実現が増加すると,我々は工場クラスの方法を修正し,新しい実現タイプと互換性を持たなければならない.これは明らかに開閉原則に反しているので,工場方法モデルが現れた.
三、工場方法モデル
ファクトリメソッドモデルは、単純なファクトリモデルの抽象的なアップグレードであり、ファクトリという概念を抽象化してインタフェースとし、各ターゲット実装クラスに対してファクトリ実装を作成し、1対1で実装し、ターゲット実装を追加した場合、同時に1つのファクトリ実装を追加すればよい.
次に例を示します.
テーブルインタフェース:Desk
/**
 *     
 */
public interface Desk {
    String getType();
}

木製テーブル:WoodenDesk
/**
 *     
 */
public class WoodenDesk implements Desk{
    private String type = "   ";
    @Override
    public String getType() {
        return type;
    }
}

プラスチックテーブル:PlasticDesk
/**
 *    
 */
public class PlasticDesk implements Desk {
    private String type = "   ";
    @Override
    public String getType() {
        return type;
    }
}

テーブルファクトリインタフェース:DeskFactory
/**
 *       
 */
public interface DeskFactory {
    Desk createDesk();
}

木製テーブル工場:WoodenDeskFactory
/**
 *       
 */
public class WoodenDeskFactory implements DeskFactory{
    @Override
    public Desk createDesk(){
        return new WoodenDesk();
    }
}

プラスチックテーブル工場:
/**
 *       
 */
public class PlasticDeskFactory implements DeskFactory {
    @Override
    public Desk createDesk() {
        return new PlasticDesk();
    }
}

テストクラス:Clienter
/**
 *    
 */
public class Clienter {
    public static void main(String[] args) {
        DeskFactory factory = new WoodenDeskFactory();
        Desk desk = factory.createDesk();
        System.out.println(desk.getType());
    }
}

実行結果:
   

四、解析
上記の例から容易に分かるように,ファクトリメソッドモードの重点はこのファクトリインタフェースにある.
目標は無限に拡張することができて、工場類もそれに伴って拡張して、1対1で存在して、開閉の原則を満たして、しかし目標の実現が比較的に多いならば、工場の実現類も増加して、簡潔ではありません.
MyBatisでは比較的多く使用されており,トランザクションモジュールとデータソースモジュールはいずれもファクトリメソッドモードを使用している.