ヘッドファーストデザインPatterns--簡単なファクトリパターン(静的ファクトリー)

この記事では、UMLのクラス図の基本的な知識、明確には存在しない場合を参照することができます:

----正の解を食べるためにUML正しい方法!

我々は、オブジェクトをインスタンス化する場合、最初に考えたのは、新しいオブジェクト、ない家、新しい、ノーガールフレンド、新しい、さらに良いです。多数のオブジェクトがある場合、オブジェクトは、一般的に、我々は「インタフェース」の開発過程で直面しているので、強い結合、柔軟性が悪化し、形成するために、クラスとオブジェクトの間で、新しいクラスとの結合関係の間で確立されます多型によるプログラミング、このインターフェースは、新しいクラスで実装することができます。しかし、同じコードが大きすぎる、あなたはそれが働いて得ます!だから、新しいに加えて、あなたはそれを行うには他に方法がないのだろうか?これは、デザインパターンのデザインが含まれます。

ユーザーはテストクラスで作成するタイプを指定します。

私たちは、クラス図を見てください:
ここに画像を挿入説明

説明:ピザクラスは継承ピザCheesePizzaとClamPizzaクラス、その後、抽象クラスであるとして、ユーザーがピザを望んでいる、し、SimpleFactoryシンプルな植物でピザの種類に応じて、その後し、SimpleFactoryにPizzStoreで結合指定を作成するために、そして、準備メソッドをオーバーライドPizzaStoreはその後し、SimpleFactory自体はピザの種類を気にしないで指定されたタイプを、作ってみよう、伝えます。し、SimpleFactoryはピザ、PizzaStore実装ベーク、カット、ボックスの作成を完了した後、どのような最終的なピザ、カット、ボックス操作を焼く必要があります。もちろん、学生たちはピザそれのようなものを追加した場合、その後、私たちは一口OCP「拡張のためのオープンが、修正のため閉鎖」の原則を行い、で取得するし、SimpleFactoryを追加することができ、尋ねるがあるでしょう!具体的な実施プロセスで見てみましょう

  • ピザ
public abstract class Pizza {

    private String name;
    public abstract void prepare();

    public void bake(){
        System.out.println(name+ "  "+ "backing");
    }
    public void cut(){
        System.out.println(name+ "  "+ "cutting");
    }
    public void box(){
        System.out.println(name+ "  "+ "boxing");
    }

    public void setName(String name) {
        this.name = name;
    }

}
  • ClamPizza
public class ClamPizza extends Pizza {
    @Override
    public void prepare() {
        System.out.println("加入ClamPizza调料");
    }
}
  • チーズピザ
public class CheesePizza extends Pizza {
    @Override
    public void prepare() {
        System.out.println("加入CheesePizza调料");
    }
}

  • し、SimpleFactory
public  class SimpleFactory {

    public Pizza createPizza(String type){
        Pizza pizza = null;

        if (type.equals("Clam")){
            pizza = new ClamPizza();
            pizza.setName(type);
        }else if (type.equals("Cheese")){
            pizza = new CheesePizza();
            pizza.setName(type);
        }
        return pizza;
    }
}
  • PizzaStore
public class PizzaStore {

    SimpleFactory simpleFactory;

    public void setSimpleFactory(SimpleFactory simpleFactory) {
        this.simpleFactory = simpleFactory;
    }

    public Pizza orderPizza(String type, SimpleFactory simpleFactory){
        Pizza pizza;

        pizza = simpleFactory.createPizza(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;

    }
}
  • TestPizza
public class TestPizza {
    public static void main(String[] args) {

        //新建一个PizzaStore用来卖Pizza
        PizzaStore pizzaStore = new PizzaStore();

        //传入要买的类型,并且要有一个工厂
        pizzaStore.orderPizza("Clam",new SimpleFactory());
    }
}
  • テスト結果
    ここに画像を挿入説明

ダイナミック入力を作成するためのコンソールユーザーのタイプ:

1)ピザの2種類があります:ピザ、ギリシャ(ギリシャ語)、チーズのピザ(チーズ)
2)ピザの生産がBAK、カット、ボックス;
3)ピザの作成プロセスの種類を考えます

  • ピザ
//定义一个抽象的披萨类
public abstract  class Pizza {
	
	//抽象方法
    public abstract void prepare();

	//制做的工艺
    public void bake() {
        System.out.println("baking;");
    }

    public void cut() {
        System.out.println("cuting;");
    }

    public void box() {
        System.out.println("boxing;");
    }

}
  • CheesePizza2
public class CheesePizza2 extends Pizza {
    @Override
    public void prepare() {
        System.out.println("给奶酪披萨准备原材料");
    }
}

  • GreekPizza2
public class GreekPizza2 extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给希腊披萨准备原材料");
    }
}

  • orderPizza2
public class orderPizza2 {

    Pizza pizza = null;

    public Pizza orderPizza(String orderType){

        if (orderType.equals("greek")){
            pizza = new GreekPizza2();
        }else if (orderType.equals("cheese")){
            pizza = new CheesePizza2();
        }

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;

    }
}

  • PizzaStore
public class PizzaStore {
    public static void main(String[] args) {

        orderPizza2 orderPizza2 = new orderPizza2();
        orderPizza2.orderPizza("greek");
        orderPizza2.orderPizza("cheese");

    }
}
  • テスト

ここに画像を挿入説明

  • クラス図があります。
    ここに画像を挿入説明

我々は、機能を実現しながら、私たちはorderPizza2内側に設計された新しい方法で、ピザのようなものを作成するために、メソッド名に応じて引き抜くことができれば、我々は、orderPizza2の追加に必要なピザの種類を追加する場合オブジェクトを作成し、orderPizza2内でこれを行うには、この新しい方法を重合し、それは拡張のためにオープンになりますが、原則OCPを満たすために変更のため閉鎖、先に行ってきました!

  • ピザ
public abstract  class Pizza {

    public abstract void prepare();

    public void bake() {
        System.out.println("baking;");
    }

    public void cut() {
        System.out.println("cuting;");
    }

    public void box() {
        System.out.println("boxing;");
    }

}
  • CheesePizza2
public class CheesePizza2 extends Pizza {
    @Override
    public void prepare() {
        System.out.println("经制做奶酪披萨准备原材料");
    }
}
  • GreekPizza2
public class GreekPizza2 extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给希腊披萨准备原材料");
    }
}

  • SimpleFactory2
public class SimpleFactory2 {

    public Pizza createPizza(String orderType){

        Pizza pizza = null;

        if (orderType.equals("greek")){
            pizza = new GreekPizza2();
        }else if (orderType.equals("cheese")){
            pizza = new CheesePizza2();
        }

        return pizza;
    }

}
  • OrderPizza2
//定义一个生成厂商,对传入的某种披萨进行prepare,bake,cut,box操作
public class orderPizza2 {

    SimpleFactory2 simpleFactory2;

    Pizza pizza = null;

    public orderPizza2(SimpleFactory2 simpleFactory2) {
        setSimpleFactory2(simpleFactory2);
    }

    public void  setSimpleFactory2(SimpleFactory2 simpleFactory2) {

        this.simpleFactory2 = simpleFactory2;

        //获取披萨的类型是什么
        String orderType = " ";
        orderType = getype();

        pizza = simpleFactory2.createPizza(orderType);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

    }

    //写一个方法,可以获取客户端希望订购的披萨种类
    private String getype(){
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input Pizza type:");
            String str = strin.readLine();
            return str;
        }catch (IOException e){
            e.printStackTrace();
            return "";
        }
    }
}
  • PizzaStore
public class PizzaStore {

    public static void main(String[] args) {

        new orderPizza2(new SimpleFactory2());
    }
}
  • 結果

ここに画像を挿入説明

  • 図クラスは表し
    ここに画像を挿入説明

あなただけのファクトリクラスでは、ピザの新しい種類を追加したい場合はピザの事例では、我々は、工場出荷時の準備を実現するために来て、種類に応じてピザを作成するために、焼く、カット、ボックス操作OrderPizza2の内部を使用します方法への参加、他のコードは、このようにコードを簡素化の目的を達成し、変更しないでください!

この記事では、UMLのクラス図の基本的な知識、明確には存在しない場合を参照することができます:

----正の解を食べるためにUML正しい方法!

あなたは、コメント領域に書き込むことができる問題があると思うなら!

公開された47元の記事 ウォン称賛34 ビュー8862

おすすめ

転載: blog.csdn.net/weixin_42893085/article/details/105309872