设计模式(三)——Java工厂方法模式
工厂方法模式
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("该地域暂时没有开通功能!"); } } }
仅供参考,有错误还请指出!
有什么想法,评论区留言,互相指教指教。
蓝天和白云是标配。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端