ヘッドファーストデザインPatterns--ファクトリメソッド

私たちは今、誰が、例えば、BJCheessPizza、BJPepoperPizza、LDChessPizzaこの時点で他の種は、我々は()メソッドは抽象型としてOrderPizzaクラスcreatePizzaを定義していることができ、それが地域の特性に応じた順序にピザを注文、である、機能を追加したいですこの方法を実装するために呼び出すと、の種類に対応する機能を実装するために
表現すると、以下のクラス図です。

すみません! シンプルなファクトリパターン(静的工場) - モデルは非常に牛で設計します

参照を理解していない場合はもちろん、これは、改革の章に基づいています。

public abstract  class Pizza {

    private String name;

    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;");
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • BJChessPizza
public class BJChessPizza extends  Pizza{
    @Override
    public void prepare() {
        setName("北京奶酪披萨");
        System.out.println("北京奶酪披萨BjChessPizza 准备原材料");
    }
}
  • BJPepperPizza
public class BJPepperPizza extends  Pizza{
    @Override
    public void prepare() {
        setName("BJPepperPizza");
        System.out.println("BJPepperPizza 准备原材料");
    }
}
  • LDChessPizza
public class LDChessPizza extends  Pizza{
    @Override
    public void prepare() {
        setName("伦敦奶酪披萨");
        System.out.println("LDChessPizza 准备原材料");
    }
}
  • LDPepperPizza
public class LDPepperPizza extends  Pizza{
    @Override
    public void prepare() {
        setName("LDPepperPizza");
        System.out.println("LDPepperPizza 准备原材料");
    }
}
  • BJOrderPizza
public class BJOrderPizza extends OrderPizza2{

    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if (orderType.equals("chess")){
            pizza = new BJChessPizza();
        }else if (orderType.equals("pepper")){
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
  • LDOrderPizza
public class LDOrderPizza extends OrderPizza2{

    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if (orderType.equals("cheese")){
            pizza = new LDChessPizza();
        }else if (orderType.equals("pepper")){
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}
  • OrderPizza2(このクラスは、それがどのが、入力の種類に応じて、対処するOrderPizzaを指定しますが、呼び出しに責任があるのサブクラスであり、特定の新しいターゲットを扱っていません)
public abstract class OrderPizza2 {

    //定义一个抽象方法,createPizza,让各个工厂子类自己实现
    abstract Pizza createPizza(String orderType);

    Pizza pizza;

    public OrderPizza2() {
        String orderType;
        do {
            orderType = getype();
            pizza = createPizza(orderType);//抽象方法,由工厂子类来完成

            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        } while (true);
    }

    //写一个方法,可以获取客户端希望订购的披萨种类
    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 BJOrderPizza();
    }
}
  • 業績
    ここに画像を挿入説明

概要:あなたはメソッドパターンはタイプに応じている工場を作成すると、各タイプは、そのサブクラスに、具体的な実装を生成するために、独自の工場に引き渡され、その後、クラスを使用することにより、着信の種類として作成します完全に、あなたも記述するために、「工場の工場」を使用することができます!

ここに画像を挿入説明

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

おすすめ

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