Javaのデザインパターンに - シンプルなファクトリパターン

シンプルなファクトリパターンの概念を簡単に見て:

また、静的なファクトリメソッドパターンとして知られているクラスに属するスキーマを作成するための簡単なファクトリパターン、;特に他のクラスのインスタンスを作成するための責任のクラスで定義され、インスタンスが作成され、通常は共通の親クラスを持っています

記述から、我々は、機能の一部を抽出することができます。

  • 共通の親を持つクラスの各インスタンス
  • 特定のクラスは他のクラスのインスタンスを作成するための責任があります

今、私たちは、工場出荷時のパターン例を通じて実現するために来る:私たちが今必要水果工厂なさまざまな果物として、??は、取得するには...

まず、(?、?)そのうちの一つを作成することから始め、共通の親クラスFruit

  • 親クラスのフルーツFruit.java
public abstract class Fruit {
	
    abstract void get();
}

第二に、今私たちが作る?、?具体的な実装クラス

  • ?クラスの実装Apple.java
public class Apple extends Fruit {
    /**
     * 获得苹果
     */
    @Override
    public void get() {
        System.out.println("采集?");
    }
}
  • ?クラスの実装Banana.java
public class Banana extends Fruit {
    /**
     * 获得香蕉
     */
    @Override
    public void get() {
        System.out.println("采集?");
    }
}

第三には、一般的に私たちは普通のことでありnew、以下に示すように、オブジェクトを作成するには:

//创建苹果和香蕉的实例对象
Fruit apple = new Apple();
apple.get();
Fruit banana = new Banana();
banana.get();

ここに画像を挿入説明

第四には、工場を通って、今、私たちは、Aにそれを変換するために、オブジェクトモデルを作成する必要があります

  • 私たちが作成するFruitFactory.javaファクトリクラスを(一般的に工場モデルのクラス名である使用*** Factory.java)
public class FruitFactory {
    /**
     * 根据不同的类型创建不同的对象
     *
     * @param type
     * @return
     */
    public static Fruit getFruit(String type) {
        switch (type) {
            case "apple":
                return new Apple();
            case "banana":
                return new Banana();
            default:
                System.out.println("找不到所匹配的对象!");
                return null;
        }
    }
 }
  • 市内通話は少し長く簡素化することができます
Fruit apple = FruitFactory.getFruit("apple");
Fruit banana = FruitFactory.getFruit("banana");
apple.get();
banana.get();

操作の結果:
コレクション?
コレクション?

第五は、私たちは、単純な工場を達成していること、および、果物を生産することができます。しかし、よく見るには、問題を見つける:??私たちのような新しい果物を生産したいときは:とき、私たちはそうする必要がある上... ???植物のgetFruit()機能変換は、次の通り:

/**
 * 根据不同的类型创建不同的对象
 *
 * @param type
 * @return
 */
public static Fruit getFruit(String type) {
    switch (type) {
        case "apple":
            return new Apple();
        case "banana":
            return new Banana();
            //西瓜
        case "watermelon":
            return new Watermelon();
            //菠萝
        case "pineapple":
            return new Pineapple();
        case "peach":
        	//桃
            return new Peach();
        default:
            System.out.println("找不到所匹配的对象!");
            return null;
    }
}

私たちは、あなたは常にこの機能を変換する必要がありますので、他の果物の追加を続行する必要がある場合は、私たちがここでさらに簡略化することができることをどのような方法があり、以下のように、答えはイエスです。

第六に、さらに簡素化利用の反射にオブジェクトファクトリを作成します

  • FruitFactory.java
public class FruitFactory {
    /**
     * 使用反射
     * 进一步简化工厂的创建
     *
     * @param type 这个参数就是需要创建的实例路径,eg:包名.类名
     */
    public static Fruit getFruit2(String type) throws ClassNotFoundException,
            IllegalAccessException, InstantiationException {
        //加载类的实例
        Class<?> name = Class.forName(type);
        return (Fruit) name.newInstance();
    }
}

そして、一緒に変更するには従って、同じ必要性で電話をかけます

//使用反射创建
try {
    Fruit apple = FruitFactory.getFruit2(Apple.class.getName());
    apple.get();
    Fruit banana = FruitFactory.getFruit2(Banana.class.getName());
    banana.get();
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
    e.printStackTrace();
}

なお⚠️それは、このように作成されるオブジェクトである必要があり、ここで完全なパス引数を入力しますcom.xx.xx.Apple、それ以外の場合はスローされますClassNotFoundException

以下のように、ライン上で着信ターゲットラインに対して再度唯一の場所を使用するために絶えず再遭遇したとき、追加の異なるオブジェクトではなく、リハビリのファクトリメソッドを必要とする必要があることで、このようにして作成されたオブジェクトの七つのクラス:

Fruit watermelon = FruitFactory.getFruit2(Watermelon.class.getName());
Fruit pineapple = FruitFactory.getFruit2(Pineapple.class.getName());
Fruit peach = FruitFactory.getFruit2(Peach.class.getName());
//.....等等
公開された140元の記事 ウォンの賞賛546 ビュー540 000 +

おすすめ

転載: blog.csdn.net/a_zhon/article/details/90577887