1 /** 2 * 最初的设计 3 */ 4 Pizza orderPizaa(String type){ 5 Pizza pizza; 6 /* 7 *此代码没有对修改封闭 8 *压力来自于增加更多的比萨类型 9 */ 10 if(type.equals("cheese")){ 11 pizza = new CheesePizza(); 12 } else if(type.equals("greek")){ 13 pizza = new GreekPizza(); 14 } else if(type.equals("pepperoni")){ 15 pizza = new PepperoniPizza(); 16 } 17 18 pizza.prepare(); 19 pizza.bake(); 20 pizza.cut(); 21 pizza.box(); 22 return pizza; 23 } 24 /** 25 *建立一个简单工厂 26 */ 27 public class SimplePizzaFactory{ 28 public Pizza createPizza(String type){ 29 Pizza pizza = null; 30 31 if(type.equals("cheese")){ 32 pizza = new CheesePizza(); 33 } else if(type.equals("greek")){ 34 pizza = new GreekPizza(); 35 } else if(type.equals("pepperoni")){ 36 pizza = new PepperoniPizza(); 37 } 38 return pizza; 39 } 40 } 41 42 public class PizzaStore{ 43 SimplePizzaFactory factory; 44 45 public PizzaStore(SimplePizzaFactory factory){ 46 this.factory = factory; 47 } 48 49 public Pizza orderPizaa(String type){ 50 Pizza pizza; 51 pizza = fatory.createPizza(type); 52 53 pizza.prepare(); 54 pizza.bake(); 55 pizza.cut(); 56 pizza.box(); 57 return pizza; 58 } 59 } 60 /** 61 *让比萨制作活动局限于PizzaStore类,而同时又能让这些加盟店依然可以自由地制作该区域的风味 62 *工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 63 */ 64 public abstract class PizzaStore{ 65 66 public Pizza orderPizza(String type){ 67 Pizza pizza; 68 69 pizza = createPizza(type); 70 pizza.prepare(); 71 pizza.bake(); 72 pizza.cut(); 73 pizza.box(); 74 75 return pizza; 76 } 77 78 abstract Pizza createPizza(String type); 79 } 80 /* 81 * 开加盟店:纽约风味 82 */ 83 public class NYPizzaStore extends PizzaStore{ 84 85 Pizza createPizza(String item){ 86 if(type.equals("cheese")){ 87 pizza = new NYStyleCheesePizza(); 88 } else if(type.equals("greek")){ 89 pizza = new NYStyleGreekPizza(); 90 } else if(type.equals("pepperoni")){ 91 pizza = new NYStylePepperoniPizza(); 92 } else return null; 93 } 94 } 95 96 public abstract class Pizza{ 97 String name; 98 String dough; 99 String sauce; 100 ArrayList toppings = new ArrayList(); 101 102 void prepare(){ 103 System.out.println("Preparing "+name); 104 ... 105 } 106 void bake(){ 107 System.out.println("Bake for 25 minutes at 350"); 108 } 109 } 110 111 public class NYStyleCheesePizza extends Pizza{ 112 public NYStyleCheesePizza(){ 113 name="NY Style Sauce and Cheese Pizza"; 114 dough = "Thin Crust Dough"; 115 sauce = "Marinara Sauce"; 116 117 toppings.add("Grated Reggiano Cheese"); 118 } 119 } 120 121 public class PizzaTestDrive{ 122 123 public static void main(String[] args){ 124 PizzaStore nyStore = new NYPizzaStore(); 125 Pizza pizza = nyStore.orderPizza("cheese"); 126 } 127 } 128 129 /** 130 * 一个很依赖的比萨店 131 */ 132 public class DependentPizzaStore{ 133 134 public Pizza createPizza(String style, String type){ 135 if(style.equals("NY")){ 136 if(type.equals("cheese")){ 137 pizza = new NYStyleCheesePizza(); 138 } else if(type.equals("greek")){ 139 pizza = new NYStyleGreekPizza(); 140 } else if(type.equals("pepperoni")){ 141 pizza = new NYStylePepperoniPizza(); 142 } 143 } else if(style.equals("Chicago")){ 144 if(type.equals("cheese")){ 145 pizza = new ChicagoStyleCheesePizza(); 146 } else if(type.equals("greek")){ 147 pizza = new ChicagoStyleGreekPizza(); 148 } else if(type.equals("pepperoni")){ 149 pizza = new ChicagoStylePepperoniPizza(); 150 } 151 } else { 152 System.out.println("Error: invalid type of pizza"); 153 return null; 154 } 155 156 pizza.prepare(); 157 pizza.bake(); 158 pizza.cut(); 159 pizza.box(); 160 161 return pizza; 162 } 163 } 164 /* 165 *设计原则:要依赖对象,不要依赖具体类。 166 */ 167 168 /** 169 * 建造原料工厂 170 */ 171 public interface PizzaIngredientFactory{ 172 public Dough createDough(); 173 public Sauce createSauce(); 174 public Cheese createCheese(); 175 public Veggies[] createVeggies(); 176 public Pepperoni createPepperoni(); 177 public Clams createClam(); 178 } 179 /** 180 * 创建纽约原料工厂 181 */ 182 public class NYPizzaIngredientFactory implements PizzaIngredientFactory{ 183 public Dough createDough(){ 184 return new ThinCrustDough(); 185 } 186 ... 187 } 188 189 /** 190 * 重做比萨 191 */ 192 public abstract class Pizza{ 193 194 String name; 195 Dough dough; 196 Sauce sauce; 197 ... 198 199 abstract void prepare(); 200 201 void bake(){ 202 System.out.println("Bake for 25 minutes at 350"); 203 } 204 205 ... 206 } 207 208 public class CheesePizza extends Pizza{ 209 PizzaIngredientFactory ingredientFactory; 210 211 public CheesePizza(PizzaIngredientFactory ingredientFactory){ 212 this.ingredientFactory = ingredientFactory; 213 } 214 215 void prepare(){ 216 System.out.orintln("Preparing "+name); 217 dough = ingredientFactory.createDough(); 218 sauce = ingredientFactory.createSauce(); 219 cheese = ingredientFactory.createCheese(); 220 } 221 }
来源:http://www.cnblogs.com/wanghui390/p/3653398.html