Head First-设计模式-工厂模式

工厂模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。
类图:
这里写图片描述
话不多说、直接做实例:
需求同上篇简单工厂模式,开一家pizza店,提供四种披萨(可以更多种),pizza店负责订pizza,pizza工厂负责做pizza,现在需要扩展pizza店,就是对于不同地区的pizza店对着四种pizza有不同的口味要求啥的。
类图: 哈哈 画成这样也是gg了。。
这里写图片描述
1.首先把pizza定义成接口(接口可以是interface和class)

class Pizza{//作为接口   定义做pizza一套流程,具体差异子类实现去重写
    //成员变量
     String name;//哪种pizza
     double price;//价格
     String dough;//面团
     String sauce;//调料
     Pizza pizza ;
     public void  prepare(){//准备
         System.out.println("正在为您准备"+name+"的材料");
     }
     public void bake(){//烘烤
         System.out.println("正在为您烘烤pizza,请稍等半个点。。");
     }
     public void cut(){//切
         System.out.println("正在为您把pizza切块。。");
     }
     public void box(){//装盒
         System.out.println("正在为您将pizza打包装盒。。");
     }

    public  void print(){//打印一下点了啥
        System.out.println("您好,您点了"+name+", 一共"+price+"$");
    }
}

2.定义那四种pizza

class CheesePizza extends Pizza{//具体pizza类

    public CheesePizza(){//芝士pizza
        name = "cheesePizza";
        price = 3.3;
        dough = "面团团团团团";
        sauce = "酱酱酱酱酱酱酱";
    }
}
class NYCheesePizza extends CheesePizza{//纽约地区商店要芝士pizza来点不同风味 继承了CheesePizza,别忘了CheesePizza是继承pizza的,所以NYCheesePizza 类的对象可以直接定义为pizza类型 向上转型
    public NYCheesePizza(){
        name = "纽约风味起司pizza";
        price = 4.4;
        dough = "纽约面团";
        sauce = "纽约酱酱酱";
    }
}
class ClamPizza extends Pizza{//蛤蜊pizza
    public ClamPizza(){
        name = "clamPizza";
        price = 4.4;
        dough = "面团团面团团";
        sauce = "酱酱酱酱酱酱";
    }
}
class NYClamPizza extends ClamPizza{
    public NYClamPizza(){
        name = "纽约风味蛤蜊pizza";
        price = 4.4;
    }
}
class PepperoniPizza extends Pizza{//蒜香pizza
    public PepperoniPizza(){
        name = "pepperoniPizza";
        price = 5.5;
        dough = "面团面团";
        sauce = "酱紫";
    }
}
class NYPepperoniPizza extends PepperoniPizza{
    public NYPepperoniPizza(){
        name = "纽约蒜香风味pizza";
        price = 5.5;
    }
}
class VeggiePizza extends Pizza{//蔬菜pizza 
    public VeggiePizza(){
        name = "VeggiePizza";
        price = 6.6;
        dough = "面main面";
        sauce = "酱紫酱紫";
    }
}
class NYVeggiePizza extends VeggiePizza{
    public NYVeggiePizza(){
        name ="纽约蔬菜pizza";
        price = 6.6;
    }
}

3.定义pizza商店PizzaStore类

abstract class  PizzaStore{//使用pizza商店来订pizza

    public final Pizza orderPizza(String type){
        Pizza pizza;
        pizza = createPizza(type);  //创建对象这部分拿出去了
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        pizza.print();
        return pizza;
    }
    public abstract Pizza createPizza(String type);//将创建对象封装到抽象方法里让子类去实现,也就是让具体的pizza店决定生成哪种pizza,注意不是子类决定,是有type决定的,子类只是根据type去生成
}

4.现在来写具体商店

//纽约地区pizza店
class NYPizzaStore extends PizzaStore{ 
    public Pizza createPizza(String type){
        if(type.equals("cheese")){
            return new NYCheesePizza();
        }else if (type.equals("veggie")){
            return new NYVeggiePizza();
        }else if(type.equals("pepperoni")){
            return new NYPepperoniPizza();
        }else if (type.equals("clam")){
            return new NYClamPizza();
        }else return null;
    }
}

5.好了,去纽约商店订pizza吧

public class test{
    public static void main(String args[]){
    NYPizzaStore pizza = new NYPizzaStore();
    pizza.orderPizza("clam");
    System.out.println("---------------------------------------");
    pizza.orderPizza("pepperoni");
    }
}

运行结果:
正在为您准备纽约风味蛤蜊pizza的材料
正在为您烘烤pizza,请稍等半个点。。
正在为您把pizza切块。。
正在为您将pizza打包装盒。。
您好,您点了纽约风味蛤蜊pizza, 一共4.4$

正在为您准备纽约蒜香风味pizza的材料
正在为您烘烤pizza,请稍等半个点。。
正在为您把pizza切块。。
正在为您将pizza打包装盒。。
您好,您点了纽约蒜香风味pizza, 一共5.5$

猜你喜欢

转载自blog.csdn.net/FightingITPanda/article/details/80654589