什麼是工廠模式?
面向對象原則:
要點:
工廠模式應用實例:比薩店
簡單工廠實現
/Pizza.java
- package pizzas;
- import java.util.ArrayList;
- /***
- * 抽象pizza類
- *
- */
- abstract public class Pizza {
- String name;
- String dough;
- String sauce;
- ArrayList toppings = new ArrayList();
- public String getName() {
- return name;
- }
- @Override
- public String toString() {
- 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();
- }
- //準備
- 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);
- }
- }
- package pizzas;
- /**
- *
- */
- public class CheesePizza extends Pizza {
- @SuppressWarnings("unchecked")
- public CheesePizza() {
- name = "Cheese Pizza";
- dough = "Regular Crust";
- sauce = "Marinara Pizza Sauce";
- toppings.add("Fresh Mozzarella");
- toppings.add("Parmesan");
- }
- }
- package pizzas;
- /**
- *
- */
- public class ClamPizza extends Pizza {
- @SuppressWarnings("unchecked")
- public ClamPizza() {
- name = "Clam Pizza";
- dough = "Thin crust";
- sauce = "White garlic sauce";
- toppings.add("Clams");
- toppings.add("Grated parmesan cheese");
- }
- }
- package pizzas;
- /**
- *
- */
- public class PepperoniPizza extends Pizza {
- @SuppressWarnings("unchecked")
- public PepperoniPizza() {
- name = "Pepperoni Pizza";
- dough = "Crust";
- sauce = "Marinara sauce";
- toppings.add("Sliced Pepperoni");
- toppings.add("Sliced Onion");
- toppings.add("Grated parmesan cheese");
- }
- }
- package pizzas;
- /**
- * 素食pizza
- *
- */
- public class VegglePizza extends Pizza {
- @SuppressWarnings("unchecked")
- public VegglePizza(){
- name = "Veggie Pizza";
- dough = "Crust";
- sauce = "Marinara sauce";
- toppings.add("Shredded mozzarella");
- toppings.add("Grated parmesan");
- toppings.add("Diced onion");
- toppings.add("Sliced mushrooms");
- toppings.add("Sliced red pepper");
- toppings.add("Sliced black olives");
- }
- }
/SimplePizzaFactory.java
- package pizzas;
- /**
- * 簡單工廠方法
- */
- 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();
- } else if(type.equals("clam")) {
- pizza = new ClamPizza();
- } else if(type.equals("veggie")) {
- pizza = new VegglePizza();
- }
- return pizza;
- }
- }
/PizzaStore
- package pizzas;
- 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;
- }
- }
/PizzaTestDriver
- package pizzas;
- /**
- * 簡單工廠的測試類
- */
- public class PizzaTestDriver {
- 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("veggie");
- System.out.println("We ordered a " + pizza.getName() + "\n");
- }
- }
工廠方法模式實現
/Pizza.java
- package pizzafm;
- import java.util.ArrayList;
- /**
- *
- */
- public abstract class Pizza {
- String name; //名稱
- String dough; //麪糰類型
- String sauce; //一套佐料
- ArrayList toppings = new ArrayList();
- public void prepare() {
- System.out.println("Preparing " + name);
- System.out.println("Tossing dough...");
- System.out.println("Adding sauce...");
- System.out.println("Adding toppings: ");
- for(int i = 0; i < toppings.size(); i++) {
- System.out.println(" " + toppings.get(i));
- }
- }
- public void bake() {
- System.out.println("Bake for 25 minutes at 350");
- }
- public void cut() {
- System.out.println("Cutting the pizza into diagonal slices");
- }
- public void box() {
- System.out.println("Place pizza in official PizzaStore box");
- }
- public String getName() {
- return name;
- }
- }
- package pizzafm;
- /**
- * 紐約披薩
- *
- */
- public class NYStyleCheesePizza extends Pizza {
- public NYStyleCheesePizza() {
- name = "NY Style Sauce and Cheese Pizza";
- dough = "Thin Crust Dough";
- sauce = "Marinara Sauce";
- toppings.add("Grated Reggiano Cheese");
- }
- }
- package pizzafm;
- public class NYStyleClamPizza extends Pizza {
- public NYStyleClamPizza() {
- name = "NY Style Clam Pizza";
- dough = "Thin Crust Dough";
- sauce = "Marinara Sauce";
- toppings.add("Grated Reggiano Cheese");
- toppings.add("Fresh Clams from Long Island Sound");
- }
- }
- package pizzafm;
- public class NYStylePepperoniPizza extends Pizza {
- public NYStylePepperoniPizza() {
- name = "NY Style Pepperoni Pizza";
- dough = "Thin Crust Dough";
- sauce = "Marinara Sauce";
- toppings.add("Grated Reggiano Cheese");
- toppings.add("Sliced Pepperoni");
- toppings.add("Garlic");
- toppings.add("Onion");
- toppings.add("Mushrooms");
- toppings.add("Red Pepper");
- }
- }
- package pizzafm;
- public class NYStyleVeggiePizza extends Pizza {
- public NYStyleVeggiePizza() {
- name = "NY Style Veggie Pizza";
- dough = "Thin Crust Dough";
- sauce = "Marinara Sauce";
- toppings.add("Grated Reggiano Cheese");
- toppings.add("Garlic");
- toppings.add("Onion");
- toppings.add("Mushrooms");
- toppings.add("Red Pepper");
- }
- }
- package pizzafm;
- /**
- * 芝加哥披薩
- *
- */
- public class ChicagoStyleCheesePizza extends Pizza {
- public ChicagoStyleCheesePizza() {
- name = "Chicago Style Deep Dish Cheese Pizza";
- dough = "Extra Thick Crust Dough";
- sauce = "Plum Tomato Sauce";
- toppings.add("Shredded Mozzarella Cheese");
- }
- public void cut() {
- System.out.println("Cutting the pizza into square slices");
- }
- }
- package pizzafm;
- public class ChicagoStyleClamPizza extends Pizza {
- public ChicagoStyleClamPizza() {
- name = "Chicago Style Clam Pizza";
- dough = "Extra Thick Crust Dough";
- sauce = "Plum Tomato Sauce";
- toppings.add("Shredded Mozzarella Cheese");
- toppings.add("Frozen Clams from Chesapeake Bay");
- }
- public void cut() {
- System.out.println("Cutting the pizza into square slices");
- }
- }
- package pizzafm;
- public class ChicagoStylePepperoniPizza extends Pizza {
- public ChicagoStylePepperoniPizza() {
- name = "Chicago Style Pepperoni Pizza";
- dough = "Extra Thick Crust Dough";
- sauce = "Plum Tomato Sauce";
- toppings.add("Shredded Mozzarella Cheese");
- toppings.add("Black Olives");
- toppings.add("Spinach");
- toppings.add("Eggplant");
- toppings.add("Sliced Pepperoni");
- }
- public void cut() {
- System.out.println("Cutting the pizza into square slices");
- }
- }
- package pizzafm;
- public class ChicagoStyleVeggiePizza extends Pizza {
- public ChicagoStyleVeggiePizza() {
- name = "Chicago Deep Dish Veggie Pizza";
- dough = "Extra Thick Crust Dough";
- sauce = "Plum Tomato Sauce";
- toppings.add("Shredded Mozzarella Cheese");
- toppings.add("Black Olives");
- toppings.add("Spinach");
- toppings.add("Eggplant");
- }
- public void cut() {
- System.out.println("Cutting the pizza into square slices");
- }
- }
/PizzaStore.java
- package pizzafm;
- /**
- * 讓PizzaStore作爲超類,讓每個域類型都繼承這個PizzaStore,每個子類各自決定如何製造披薩
- */
- public abstract class PizzaStore {
- public Pizza orderPizza(String type) {
- Pizza pizza;
- pizza = createPizza(type);
- pizza.prepare();
- pizza.bake();
- pizza.cut();
- pizza.box();
- return pizza;
- }
- abstract Pizza createPizza(String type);
- }
- package pizzafm;
- public class NYPizzaStore extends PizzaStore {
- @Override
- Pizza createPizza(String type) {
- if(type.equals("cheese")){
- return new NYStyleCheesePizza();
- } else if(type.equals("veggie")) {
- return new NYStyleVeggiePizza();
- } else if(type.equals("clam")) {
- return new NYStyleClamPizza();
- } else if(type.equals("pepperoni")){
- return new NYStylePepperoniPizza();
- } else return null;
- }
- }
- package pizzafm;
- public class ChicagoPizzaStore extends PizzaStore {
- @Override
- Pizza createPizza(String type) {
- if(type.equals("cheese")) {
- return new ChicagoStyleCheesePizza();
- } else if(type.equals("veggie")) {
- return new ChicagoStyleVeggiePizza();
- } else if(type.equals("clam")) {
- return new ChicagoStyleClamPizza();
- } else return null;
- }
- }
/PizzaTestDriver.java
- package pizzafm;
- /**
- * 工廠模式測試驅動類
- */
- public class PizzaTestDriver {
- public static void main(String[] args) {
- //首先建立不同的店
- PizzaStore nyStore = new NYPizzaStore();
- PizzaStore chicagoStore = new ChicagoPizzaStore();
- Pizza pizza = nyStore.orderPizza("cheese");
- System.out.println("Ethan ordered a " + pizza.getName() + "\n");
- pizza = chicagoStore.orderPizza("cheese");
- System.out.println("Joel ordered a " + pizza.getName() + "\n");
- }
- }
抽象工廠模式實現
/Pizza.java
- package pizzaaf;
- public abstract class Pizza {
- String name;
- Dough dough;
- Sauce sauce;
- Veggies veggies[];
- Cheese cheese;
- Pepperoni pepperoni;
- Clams clam;
- abstract void prepare(); //聲明爲抽象,在這個方法中那個我們需要蒐集披薩所需的原料,而這些原料當然是來自原料工廠
- void bake(){
- System.out.println("Bake for 25 minutes at 350");
- }
- void cut() {
- System.out.println("Cutting the pizza into diagonal slices");
- }
- void box() {
- System.out.println("Place pizza in official PizzaStore box");
- }
- void setName(String name) {
- this.name = name;
- }
- String getName() {
- return name;
- }
- public String toString() {
- StringBuffer result = new StringBuffer();
- result.append("---- " + name + " ----\n");
- if (dough != null) {
- result.append(dough);
- result.append("\n");
- }
- if (sauce != null) {
- result.append(sauce);
- result.append("\n");
- }
- if (cheese != null) {
- result.append(cheese);
- result.append("\n");
- }
- if (veggies != null) {
- for (int i = 0; i < veggies.length; i++) {
- result.append(veggies[i]);
- if (i < veggies.length-1) {
- result.append(", ");
- }
- }
- result.append("\n");
- }
- if (clam != null) {
- result.append(clam);
- result.append("\n");
- }
- if (pepperoni != null) {
- result.append(pepperoni);
- result.append("\n");
- }
- return result.toString();
- }
- }
- package pizzaaf;
- public class CheesePizza extends Pizza {
- PizzaIngredientFactory ingredientFactory;
- public CheesePizza(PizzaIngredientFactory ingredientFactory) {
- this.ingredientFactory = ingredientFactory;
- }
- @Override
- void prepare() {
- System.out.println("Preparing " + name);
- dough = ingredientFactory.createDough();
- sauce = ingredientFactory.createSauce();
- cheese = ingredientFactory.createCheese();
- }
- }
- package pizzaaf;
- public class ClamPizza extends Pizza {
- PizzaIngredientFactory ingredientFactory;
- public ClamPizza(PizzaIngredientFactory ingredientFactory) {
- this.ingredientFactory = ingredientFactory;
- }
- @Override
- void prepare() {
- System.out.println("PreParing " + name);
- dough = ingredientFactory.createDough();
- sauce = ingredientFactory.createSauce();
- cheese = ingredientFactory.createCheese();
- clam = ingredientFactory.createClam();
- }
- }
- package pizzaaf;
- public class PepperoniPizza extends Pizza {
- PizzaIngredientFactory ingredientFactory;
- public PepperoniPizza(PizzaIngredientFactory ingredientFactory) {
- this.ingredientFactory = ingredientFactory;
- }
- void prepare() {
- System.out.println("Preparing " + name);
- dough = ingredientFactory.createDough();
- sauce = ingredientFactory.createSauce();
- cheese = ingredientFactory.createCheese();
- veggies = ingredientFactory.createVeggies();
- pepperoni = ingredientFactory.createPepperoni();
- }
- }
- package pizzaaf;
- public class VeggiePizza extends Pizza {
- PizzaIngredientFactory ingredientFactory;
- public VeggiePizza(PizzaIngredientFactory ingredientFactory) {
- this.ingredientFactory = ingredientFactory;
- }
- void prepare() {
- System.out.println("Preparing " + name);
- dough = ingredientFactory.createDough();
- sauce = ingredientFactory.createSauce();
- cheese = ingredientFactory.createCheese();
- veggies = ingredientFactory.createVeggies();
- }
- }
/PizzaIngredientFactory.java
- package pizzaaf;
- /**
- * 建造原料工廠
- * 在接口中,每個原料都有一個對應的方法創造該原料
- */
- public interface PizzaIngredientFactory {
- public Dough createDough();
- public Sauce createSauce();
- public Cheese createCheese();
- public Veggies[] createVeggies();
- public Pepperoni createPepperoni();
- public Clams createClam();
- }
- package pizzaaf;
- /**
- * 創建紐約原料工廠
- *
- */
- public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
- @Override
- public Dough createDough() {
- return new ThinCrustDough();
- }
- @Override
- public Sauce createSauce() {
- return new MarinaraSauce();
- }
- @Override
- public Cheese createCheese() {
- return new ReggianoCheese();
- }
- @Override
- public Veggies[] createVeggies() {
- Veggies veggies[] = {new Garlic(), new Onion(), new MushRoom(), new RedPepper()};
- return veggies;
- }
- @Override
- public Clams createClam() {
- return new FreshClams();
- }
- @Override
- public Pepperoni createPepperoni() {
- return new SlicePepproni();
- }
- }
- package pizzaaf;
- /**
- * 芝加哥披薩原料工廠
- *
- */
- public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
- @Override
- public Dough createDough() {
- return new ThickCrustDough();
- }
- @Override
- public Sauce createSauce() {
- return new plumTomatoSauce();
- }
- @Override
- public Cheese createCheese() {
- return new Mozzarella();
- }
- @Override
- public Veggies[] createVeggies() {
- Veggies veggies[] = {new BlackOlives(), new Spinach(), new EggPlant()};
- return veggies;
- }
- @Override
- public Clams createClam() {
- return new FrozenClams();
- }
- @Override
- public Pepperoni createPepperoni() {
- return new SlicedPepperoni();
- }
- }
所有原料接口,一系列產品族
- package pizzaaf;
- public interface Cheese {
- @Override
- public String toString();
- }
- package pizzaaf;
- public interface Clams {
- @Override
- public String toString();
- }
- package pizzaaf;
- public interface Dough {
- @Override
- public String toString();
- }
- package pizzaaf;
- public interface Sauce {
- @Override
- public String toString();
- }
- package pizzaaf;
- public interface Veggies {
- @Override
- public String toString();
- }
- package pizzaaf;
- public interface Pepperoni {
- @Override
- public String toString();
- }
實現Cheese的類
- package pizzaaf;
- public class Mozzarella implements Cheese {
- public String toString() {
- return "Shredded Mozzarella";
- }
- }
- package pizzaaf;
- public class ReggianoCheese implements Cheese {
- public String toString() {
- return "Reggiano Cheese";
- }
- }
實現Clams的類
- package pizzaaf;
- public class FreshClams implements Clams {
- public String toString() {
- return "Fresh Clams from Long Island Sound";
- }
- }
- package pizzaaf;
- public class FrozenClams implements Clams {
- public String toString() {
- return "Frozen Clams from Chesapeake Bay";
- }
- }
實現Sauce的類
- package pizzaaf;
- public class MarinaraSauce implements Sauce {
- public String toString() {
- return "Marinara Sauce";
- }
- }
- package pizzaaf;
- public class plumTomatoSauce implements Sauce {
- public String toString() {
- return "Tomato sauce with plum tomatoes";
- }
- }
實現Veggies的類
- package pizzaaf;
- public class EggPlant implements Veggies {
- public String toString() {
- return "Eggplant";
- }
- }
- package pizzaaf;
- public class Onion implements Veggies {
- public String toString() {
- return "Onion";
- }
- }
- package pizzaaf;
- public class Spinach implements Veggies {
- public String toString() {
- return "Spinach";
- }
- }
- package pizzaaf;
- public class MushRoom implements Veggies {
- public String toString() {
- return "Mushrooms";
- }
- }
實現Pepperoni的類
實現Dough的類
- package pizzaaf;
- public class ThickCrustDough implements Dough {
- public String toString() {
- return "ThickCrust style extra thick crust dough";
- }
- }
- package pizzaaf;
- public class ThinCrustDough implements Dough {
- public String toString() {
- return "Thin Crust Dough";
- }
- }