工厂方法模式
1 看一个新的需求
披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza。
2 思路 1
使用简单工厂模式,创建不同的简单工厂类,比如 BJPizzaSimpleFactory、LDPizzaSimpleFactory 等等.从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好
3 思路 2
使用工厂方法模式
4 工厂方法模式介绍
1) 工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
2) 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
5 工厂方法模式应用案例
1) 披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza
2) 思路分析图解
Pizza类
package com.lin.factorymethod; abstract class Pizza{ private String name; public void setName(String name) { this.name = name; } public void prepare() { System.out.println(name + " are prepared!"); } public void bake() { System.out.println(name + " are baked!"); } public void cut() { System.out.println(name + " are cutted!"); } public void box() { System.out.println(name + " are boxed!"); } } // 北京chesspizza class BJChessPizza extends Pizza{ } // 北京greekpizza class BJGreekPizza extends Pizza{ } //伦敦chesspizza class LNChessPizza extends Pizza{ } //伦敦greekpizza class LNGreekPizza extends Pizza{ }
OrderPizza
package com.lin.factorymethod; import java.util.Scanner; public abstract class OrderPizza { public OrderPizza(){ Pizza pizza = null; String orderType; while(true) { orderType = getType(); pizza = createPizza(orderType); if( pizza != null) { pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } else { System.out.println("没有这种类型!"); } } } // 定义一个抽象方法,createPizza,让各个工厂子类去实现 public abstract Pizza createPizza(String orderType); public String getType() { Scanner str = new Scanner(System.in); System.out.println("please input the type of ordered pizza:"); String type = str.next(); return type; } } class BJOrderPizza extends OrderPizza { @Override public Pizza createPizza(String orderType) { Pizza pizza = null; if(orderType.equals("cheese")) { pizza = new BJChessPizza(); pizza.setName("北京Cheese"); } else if(orderType.equals("greek")) { pizza = new BJGreekPizza(); pizza.setName("北京Greek"); } return pizza; } } class LNOrderPizza extends OrderPizza { @Override public Pizza createPizza(String orderType) { Pizza pizza = null; if(orderType.equals("cheese")) { pizza = new LNChessPizza(); pizza.setName("伦敦Cheese"); } else if(orderType.equals("greek")) { pizza = new LNGreekPizza(); pizza.setName("伦敦Greek"); } return pizza; } }
PizzaStore类
package com.lin.factorymethod; import java.util.Scanner; public class PizzaStore { public static void main(String[] args) { System.out.println("请输入地名:"); Scanner scanner = new Scanner(System.in); String place = ""; place = scanner.next(); if(place.equals("伦敦")) { new LNOrderPizza(); } else if(place.equals("北京")) { new BJOrderPizza(); } else { System.out.println("该地域暂时没有开通功能!"); } } }
仅供参考,有错误还请指出!
有什么想法,评论区留言,互相指教指教。