ファクトリモード(更新前のファクトリモード)


ファクトリモードは、複雑なオブジェクトを作成する場所に適用されます.newでオブジェクトの作成を直接完了できれば、ファクトリモードファクトリモードの主要な構成:抽象製品クラス:
package ban.com;

public abstract class Product {
    abstract void method();
}

具体的な製品類A:
package ban.com;

public class ConcreteProductCup extends Product {

    @Override
    void method() {
        System.out.println("Cup");

    }

}

具体的な製品類B:
package ban.com;

public class ConcreteProductSpoon extends Product {

    @Override
    void method() {
        System.out.println("Spoon");
    }

}

抽象ファクトリクラス:
package ban.com;

public abstract class Factory {
    public abstract Product createProduct();
}

具体的な工場類:
package ban.com;

public class ConcreteFactory extends Factory{

    @Override
    public Product createProduct(){
        return new ConcreteProductSpoon();
    }

}

顧客クラス:
package ban.com;

public class Client {
    public static void main(String[] args) {
        Factory factory=new ConcreteFactory();
        factory.createProduct().method();
    }
}

印刷を実行するデータはSpoonで、標準的なファクトリモードで、Cupオブジェクトを作成するように、ファクトリ実装クラスを作成してCupオブジェクトを生成することができます.
package ban.com;

public class ConcreteFactory extends Factory{

    @Override
    public Product createProduct(){
        return new ConcreteProductCup();
    }

}

工場モデルは主に4つのモジュールに分けられる:1、抽象工場:工場モデルの核心2、抽象製品:工場方法で作成する親3、具体的な工場クラスの実現:具体的な作成ロジック4、具体的な製品クラスの実現:製品特有のロジック
このように、それが必要な場合はその工場の実装クラスを作成しますが、コードが多く、簡潔ではありません.これにより、反射的に簡潔に具体的な製品オブジェクトを生産することができます.ここでは、汎用的な部分(後で汎用的な部分の知識を更新する)を使用して抽象的な工場を変更します.
package ban.com;

public abstract class Factory {
    public abstract  T createProduct(Class clz);
}

TはProductの汎用性を継承するため、戻り値はProductのサブクラスでなければならない.入力されたclzはクラスオブジェクトの具体的な工場で実現される.
package ban.com;

public class ConcreteFactory extends Factory{

    @Override
    public  T createProduct(Class clz) {
        Product product=null;
            try {
                //          
                product=(Product) Class.forName(clz.getName()).newInstance();
            } catch (InstantiationException | IllegalAccessException
                    | ClassNotFoundException e) {
                e.printStackTrace();
            }
        return (T) product;//  Product   
    }
}

これにより、必要なクラスの名前が直接入力されることを保証し、Clientを変更できます.
package ban.com;

public class Client {
    public static void main(String[] args) {
        Factory factory=new ConcreteFactory();
        factory.createProduct(ConcreteProductCup.class).method();
        factory.createProduct(ConcreteProductSpoon.class).method();
    }
}

印刷結果は,Cup Spoonのような利点は,比較的簡潔で動的に必要なオブジェクトを生成できることであり,従来の方式はマルチファクトリ方式となり,いずれも使用できることである.