Head First设计方式-简单工厂模式

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

一、简单工厂模式

       PizzaStore.java

public class PizzaStore {
        SimplePizzaFactory factory;//多用组合,少用继承

        public PizzaStore(SimplePizzaFactory factory) {
                this.factory = factory;
        }

        public Pizza orderPizza(String type) {
                Pizza pizza;

                pizza = factory.createPizza(type);

                pizza.prepare();
                pizza.bake();//面向接口编程
                pizza.cut();
                pizza.box();

                return pizza;
        }

}

       SimplePizzaFactory.java

public class SimplePizzaFactory {

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

                if (type.equals("cheese")) {
                        pizza = new CheesePizza();
                } else if (type.equals("pepperoni")) {
                        pizza = new PepperoniPizza();
                }
                return pizza;
        }
}

        Pizza.java

import java.util.ArrayList;

abstract public class Pizza {
	String name;
	String dough;
	String sauce;
	ArrayList toppings = new ArrayList();

	public String getName() {
		return name;
	}

	public void prepare() {
		System.out.println("Preparing " + name);
	}

	public void bake() {
		System.out.println("Baking " + name);
	}

	public void cut() {
		System.out.println("Cutting " + name);
	}

	public void box() {
		System.out.println("Boxing " + name);
	}

	public String toString() {
		// code to display pizza name and ingredients
		StringBuffer display = new StringBuffer();
		display.append("---- " + name + " ----\n");
		display.append(dough + "\n");
		display.append(sauce + "\n");
		for (int i = 0; i < toppings.size(); i++) {
			display.append((String )toppings.get(i) + "\n");
		}
		return display.toString();
	}
}

         CheesePizza.java 

public class CheesePizza extends Pizza {
        public CheesePizza() {
                name = "Cheese Pizza";
                dough = "Regular Crust";
                sauce = "Marinara Pizza Sauce";
                toppings.add("Fresh Mozzarella");
                toppings.add("Parmesan");
        }
}

        PepperoniPizza.java

public class PepperoniPizza extends Pizza {
        public PepperoniPizza() {
                name = "Pepperoni Pizza";
                dough = "Crust";
                sauce = "Marinara sauce";
                toppings.add("Sliced Pepperoni");
                toppings.add("Sliced Onion");
                toppings.add("Grated parmesan cheese");
        }
}

          PizzaTestDrive.java

public class PizzaTestDrive {

        public static void main(String[] args) {
                SimplePizzaFactory factory = new SimplePizzaFactory();
                PizzaStore store = new PizzaStore(factory);

                Pizza pizza = store.orderPizza("cheese");
                System.out.println("We ordered a " + pizza.getName() + "\n");

                pizza = store.orderPizza("pepperoni");
                System.out.println("We ordered a " + pizza.getName() + "\n");
        }
}

二、结果如下:

Head First设计方式-简单工厂模式

 三、原来creatPizza的位置代码如下:

 if (type.equals("cheese")) {
                        pizza = new CheesePizza();
                } else if (type.equals("pepperoni")) {
                        pizza = new PepperoniPizza();
                } else if (type.equals("clam")) {
                        pizza = new ClamPizza();
                } else if (type.equals("veggie")) {
                        pizza = new VeggiePizza();
                }
                return pizza;

     因为此部分是变化的,简单工厂模式封装了变化。实现了松耦合。