工厂模式
来源:互联网 发布:php入门看什么书 编辑:程序博客网 时间:2024/05/16 07:04
- 定义
工厂模式定义了一个创建对象的接口,但由子类决定实例化的类是哪一个。工厂模式方法让类把实例化推迟到子类。 - 案例分析
假设现在有一个比萨店。
Pizza orderPizza(String type){ Pizza pizza ; if(type.equals("cheese")) pizza = new CheesePizza(); else if(type.equals("greek")) pizza = new GreekPizza(); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza;}
但是这样做会有一个问题,那就是当我们需要增加和改变pizza类型时必须修改该部分代码,违反了“对扩展开放,对修改关闭的原则”
所以我们可以这么做,
Pizza PizzaStore{ Simplefactory factory; public PizzaStore(Simplefactory factory){ this.factory = factory; } Pizza orderPizza(String type){ Pizza pizza ; pizza = factory.createPizza(type) pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza;}
进一步的,如果有多个工厂我们可以如下设计
package org.sxd.factory;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);}
将PizzaStore设置成抽象类,那么子类就可以继承这个类,从而自定义ccreatePizza方法,依旧是不同的工厂了。
3. 实现
package org.sxd.factory;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 org.sxd.factory;public class PizzaTestDrive { 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"); }}
package org.sxd.factory;public class NYPizzaStore extends PizzaStore{ @Override Pizza createPizza(String type) { // TODO Auto-generated method stub if(type.equals("cheese")){ return new NYStyleCheesePizza(); } return null; }}
package org.sxd.factory;import java.util.ArrayList;public class Pizza { protected String name; protected String dough; protected String sauce; ArrayList toppings = new ArrayList(); protected void prepare(){ System.out.println("Prepareing " + name); System.out.println("Tossing dough..."); System.out.println("Adding sauce..."); System.out.println("Adding topping: "); for(int i =0; i < toppings.size(); i++){ System.out.println(" " + toppings.get(i)); } } protected void bake(){ System.out.println("Bake for 25 minutes at 350"); } protected void cut(){ System.out.println("Cutting the pizza into diagonal slices"); } protected void box(){ System.out.println("Please pizza in offical PizzaStore Box"); } public String getName(){ return name; }}
package org.sxd.factory;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"); } protected void cut(){ System.out.println("Cutting the pizza into square slices"); }}
package org.sxd.factory;public class ChicagoPizzaStore extends PizzaStore{ @Override Pizza createPizza(String type) { // TODO Auto-generated method stub if(type.equals("cheese")){ return new ChicagoStyleCheesePizza(); } return null; }}
package org.sxd.factory;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"); }}
0 0
- 工厂模式 -- 工厂方法
- 工厂模式 -- 抽象工厂
- 工厂模式-简单工厂
- 工厂模式-工厂方法
- 工厂模式:静态工厂
- 工厂模式-简单工厂
- 工厂模式-抽象工厂
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-静态工厂
- 工厂模式-抽象工厂
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 我的android第一课
- 编写可读代码的艺术(一)java&android
- mini2440硬件篇之RTC
- 小米 2016届实习生招聘笔试
- 快捷键收藏
- 工厂模式
- 作业三
- poj2388
- android 百度API定位以及获取天气
- ! LaTeX Error: Something's wrong--perhaps a missing \item.
- android Application类的用法
- Android日常源码操作、git日常操作、linux等
- uml精粹——1.介绍 & 2.开发过程
- Latex常见错误解析