工厂方法模式
来源:互联网 发布:买卖域名赚钱 编辑:程序博客网 时间:2024/06/05 11:16
工厂方法模式(Factory Method Pattern):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的(将父类定义为抽象类,可以有抽象方法或者没有抽象方法)。工厂方法让类把实例化推迟到子类。
举个栗子:
有一家公司专门制作披萨,但是不同地方的披萨店制作的披萨是不一样的,比如:芝加哥点制作出芝加哥类型的披萨,纽约店会制作出纽约店的披萨。
思路分析:
制作披萨Pizza的流程是大致一样的,因此,可以写一个抽象类Pizza(这里我们给出的Pizza抽象类实际上没有抽象方法),芝加哥披萨和纽约披萨都要继承Pizza类。利用工厂方法模式,我们创建了类PizzaStore,我们在订购披萨的流程的过程中,创建了一个抽象方法创建披萨方法,这个方法需要由所有继承该PizzaStore实现,具体实现代码如下:
披萨饼相关的类:
Pizza.java 类如下:
/** * 匹萨 抽象类(虽然没有任何抽象方法) */public abstract class Pizza { String name; // 名称 String dough; // 面团类型 String sauce; // 酱料类型 ArrayList topping = new ArrayList(); // 一套作料 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 < topping.size(); i++) { System.out.println(" " + topping.get(i)); } } void bake() { System.out.println("Bake for 25 minutes at 350"); } void cut() { System.out.println("Cutting the pizza "); } void box() { System.out.println("Place pizza in official PizzaStore box"); } public String getName() { return name; }}
芝加哥披萨类如下:
ChicagoStyleCheesePizza.java 类:public class ChicagoStyleCheesePizza extends Pizza { public ChicagoStyleCheesePizza() { name = "Chicago Style Deep Dish Cheese Pizza"; dough = "Extra Thick Crust Dough"; sauce = "Plum Tomato Sauce"; topping.add("Shredded Mozzarella Cheese"); } void cut() { System.out.println("Cutting the pizza into square slices"); }}
纽约披萨如下:
NYStyleCheesePizza.java 类:
public class NYStyleCheesePizza extends Pizza { public NYStyleCheesePizza() { name = "NY Style Sauce and Cheese Pizza"; dough = "Thin Crust Dough"; sauce = "Marinara Sauce"; topping.add("Grated Reggiano Cheese"); }}
与实现工厂方法模式相关的类如下:
PizzaStore.java 类:
public abstract class PizzaStore { public Pizza orderPizza(String type) { Pizza pizza; pizza = createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } protected abstract Pizza createPizza(String type); // 特别注意这个}
芝加哥披萨店:
ChicagoPizzaStore.java 类:
public class ChicagoPizzaStore extends PizzaStore { @Override protected Pizza createPizza(String type) { return new ChicagoStyleCheesePizza(); }}
纽约披萨店:
NYPizzaStore.java 类:public class NYPizzaStore extends PizzaStore { @Override protected Pizza createPizza(String type) { return new NYStyleCheesePizza(); }}
编写测试类如下:
PizzaTestDrive.java 类:
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"); }}
输出如下:
Preparing NY Style Sauce and Cheese Pizza
Tossing dough...
Adding sauce...
Adding toppings:
Grated Reggiano Cheese
Bake for 25 minutes at 350
Cutting the pizza
Place pizza in official PizzaStore box
Ethan ordered a NY Style Sauce and Cheese Pizza
Preparing Chicago Style Deep Dish Cheese Pizza
Tossing dough...
Adding sauce...
Adding toppings:
Shredded Mozzarella Cheese
Bake for 25 minutes at 350
Cutting the pizza into square slices
Place pizza in official PizzaStore box
Joel ordered a Chicago Style Deep Dish Cheese Pizza
阅读全文
0 0
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式---工厂方法模式
- 【模式】工厂方法模式
- 工厂方法,抽象工厂模式
- C#工厂模式-工厂方法
- 工厂模式 和工厂方法
- 工厂模式-C-工厂方法
- 工厂模式以及工厂方法
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 工厂模式(简单工厂、工厂方法)
- 简单工厂|工厂方法|抽象工厂模式
- 设计模式-工厂模式(简单工厂模式+工厂方法模式)
- lvm逻辑逻辑卷管理
- 双向链表实现访问频度递减
- Scala中的方法和函数
- java的对象与对象引用
- 线段树——51nod1466 三角巧克力
- 工厂方法模式
- Element UI项目总结
- 基于redis实现购物车
- 包装类、String类
- unity中c#与Objective-C相互调用
- js断点调试心得
- 意大利护照预约服务号
- 【面向JS--DOM节点】
- faster rcnn学习之rpn 的生成