java编程创建型设计模式工厂方法模式示例详解
1.什么是工厂方法模式?
工厂方法模式设计方案: 将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
工厂方法模式: 定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
何时使用? 不同条件下创建不用实例时。方法是让子类实现工厂接口。
2.案例实现
假如说,我们现在有这样一个需求:客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪pizza、北京的胡椒pizza 或者是 伦敦的奶酪pizza、伦敦的胡椒pizza。披萨的制作有prepare,bake, cut, box;完成披萨店订购功能。
那么可以画一个简单的类图如下:
具体的代码我们就可以这样写:
首先是一个Pizza类,这里将它声明为抽象类,主要原因是其中的prepare方法不是恒定不变的,而是由实现它的子类来完成,也就是说制作披萨的原材料是什么怎么做,我们此时此刻不关心,那么就可以将它延迟到子类中实现。
package com.szh.factory.factorymethod.pizza; /** * 声明Pizza类为抽象类 */ public abstract class Pizza { //Pizza名称 protected String name; //准备原材料,不同的披萨不一样。因此,我们做成抽象方法,具体的原材料实现交给它的子类去完成 public abstract void prepare(); //烘烤 public void bake() { System.out.println(name + " baking;"); } //切割 public void cut() { System.out.println(name + " cutting;"); } //打包 public void box() { System.out.println(name + " boxing;"); } public void setName(String name) { this.name = name; } }
package com.szh.factory.factorymethod.pizza; public class BJCheesePizza extends Pizza { @Override public void prepare() { setName("北京的奶酪pizza"); System.out.println("北京的奶酪pizza 准备原材料"); } }
package com.szh.factory.factorymethod.pizza; public class BJPepperPizza extends Pizza { @Override public void prepare() { setName("北京的胡椒pizza"); System.out.println("北京的胡椒pizza 准备原材料"); } }
package com.szh.factory.factorymethod.pizza; public class LDCheesePizza extends Pizza{ @Override public void prepare() { setName("伦敦的奶酪pizza"); System.out.println("伦敦的奶酪pizza 准备原材料"); } }
package com.szh.factory.factorymethod.pizza; public class LDPepperPizza extends Pizza{ @Override public void prepare() { setName("伦敦的胡椒pizza"); System.out.println("伦敦的胡椒pizza 准备原材料"); } }
下面是订购Pizza的相关代码。
package com.szh.factory.factorymethod.order; import com.szh.factory.factorymethod.pizza.Pizza; import java.util.Scanner; public abstract class OrderPizza { //定义一个抽象方法, createPizza, 让各个工厂子类自己实现 abstract Pizza createPizza(String orderType); public OrderPizza() { Pizza pizza = null; String orderType = ""; do { orderType = getType(); pizza = createPizza(orderType); //抽象方法, 由工厂子类完成 // 输出pizza 制作过程 pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } while (true); } private String getType() { Scanner scanner = new Scanner(System.in); System.out.println("请输入 pizza 种类: "); String str = scanner.nextLine(); return str; } }
package com.szh.factory.factorymethod.order; import com.szh.factory.factorymethod.pizza.BJCheesePizza; import com.szh.factory.factorymethod.pizza.BJPepperPizza; import com.szh.factory.factorymethod.pizza.Pizza; public class BJOrderPizza extends OrderPizza { @Override Pizza createPizza(String orderType) { Pizza pizza = null; if (orderType.equals("cheese")) { pizza = new BJCheesePizza(); } else if (orderType.equals("pepper")) { pizza = new BJPepperPizza(); } else { throw new NullPointerException("暂无该Pizza种类...."); } return pizza; } }
package com.szh.factory.factorymethod.order; import com.szh.factory.factorymethod.pizza.*; public class LDOrderPizza extends OrderPizza { @Override Pizza createPizza(String orderType) { Pizza pizza = null; if (orderType.equals("cheese")) { pizza = new LDCheesePizza(); } else if (orderType.equals("pepper")) { pizza = new LDPepperPizza(); } else { throw new NullPointerException("暂无该Pizza种类...."); } return pizza; } }
最后我们测试一下。
package com.szh.factory.factorymethod; import com.szh.factory.factorymethod.order.BJOrderPizza; import com.szh.factory.factorymethod.order.LDOrderPizza; import java.util.Scanner; public class MainTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String content = scanner.next(); if (content.equals("Beijing")) { new BJOrderPizza(); } else if (content.equals("London")) { new LDOrderPizza(); } else { System.out.println("无法预先匹配Pizza种类...."); scanner.close(); } } }
3.JDK中的工厂方法模式
在 java.util.Calendar 这个类中就有。
以上就是java编程创建型设计模式工厂方法模式示例详解的详细内容,更多关于创建型设计模式工厂方法模式的资料请关注脚本之家其它相关文章!
相关文章
springboot之redis cache TTL选项的使用
这篇文章主要介绍了springboot之redis cache TTL选项的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-07-07
最新评论