第四节:抽象工厂模式
作者:互联网
一、抽象工厂模式
基本介绍
1、抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类;
2、抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合;
3、从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
4、将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。 这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展;
二、代码实现
使用抽象工厂模式来完成披萨项目。
UML 类图:
代码实现:
Pizza 相关类:
1 /** 2 * 将Pizza 类做成抽象 3 */ 4 public abstract class Pizza { 5 protected String name; 6 //准备原材料,不同的披萨不一样,因此,我们做成抽象方法 7 public abstract void prepare(); 8 9 //烘焙 10 public void bake() { 11 System.out.println(name + " baking;"); 12 } 13 14 //切割 15 public void cut() { 16 System.out.println(name + " cutting;"); 17 } 18 19 //打包 20 public void box() { 21 System.out.println(name + " boxing;"); 22 } 23 24 public void setName(String name) { 25 this.name = name; 26 } 27 } 28 ------------------------------------------------- 29 public class LDPepperPizza extends Pizza { 30 @Override 31 public void prepare() { 32 setName("伦敦的胡椒pizza"); 33 System.out.println(" 伦敦的胡椒pizza 准备原材料"); 34 } 35 } 36 ------------------------------------------------- 37 public class LDCheesePizza extends Pizza { 38 @Override 39 public void prepare() { 40 setName("伦敦的奶酪pizza"); 41 System.out.println(" 伦敦的奶酪pizza 准备原材料"); 42 } 43 } 44 ------------------------------------------------- 45 public class BJPepperPizza extends Pizza{ 46 @Override 47 public void prepare() { 48 setName("北京的胡椒pizza"); 49 System.out.println(" 北京的胡椒pizza 准备原材料"); 50 } 51 } 52 ------------------------------------------------- 53 public class BJCheesePizza extends Pizza { 54 @Override 55 public void prepare() { 56 setName("北京的奶酪pizza"); 57 System.out.println(" 北京的奶酪pizza 准备原材料"); 58 } 59 }
Order 相关类:
1 /** 2 * 一个抽象工厂模式的抽象层(接口) 3 */ 4 public interface AbsFactory { 5 //让下面的工厂子类来 具体实现 6 public Pizza createPizza(String orderType); 7 } 8 9 ----------------------------------------------------- 10 public class BJFactory implements AbsFactory { 11 @Override 12 public Pizza createPizza(String orderType) { 13 System.out.println("~使用的是抽象工厂模式~"); 14 Pizza pizza = null; 15 if(orderType.equals("cheese")) { 16 pizza = new BJCheesePizza(); 17 } else if (orderType.equals("pepper")){ 18 pizza = new BJPepperPizza(); 19 } 20 return pizza; 21 } 22 } 23 ----------------------------------------------------- 24 public class LDFactory implements AbsFactory { 25 @Override 26 public Pizza createPizza(String orderType) { 27 System.out.println("~使用的是抽象工厂模式~"); 28 Pizza pizza = null; 29 if (orderType.equals("cheese")) { 30 pizza = new LDCheesePizza(); 31 } else if (orderType.equals("pepper")) { 32 pizza = new LDPepperPizza(); 33 } 34 return pizza; 35 } 36 } 37 ----------------------------------------------------- 38 public class OrderPizza { 39 40 AbsFactory factory; 41 42 public OrderPizza(AbsFactory factory) { 43 setFactory(factory); 44 } 45 46 private void setFactory(AbsFactory factory) { 47 Pizza pizza = null; 48 String orderType = ""; //用户订购的类型 49 this.factory = factory; 50 51 do { 52 orderType = getType(); 53 pizza = factory.createPizza(orderType); 54 55 if (pizza != null) { 56 pizza.prepare(); 57 pizza.bake(); 58 pizza.cut(); 59 pizza.box(); 60 } else { 61 System.out.println("订购失败,该种类还未上架,敬请期待!"); 62 break; 63 } 64 } while (true); 65 66 } 67 68 69 // 写一个方法,可以获取客户希望订购的披萨种类 70 private String getType() { 71 try { 72 BufferedReader strin = new BufferedReader(new InputStreamReader(System.in)); 73 System.out.println("input pizza 种类:"); 74 String str = strin.readLine(); 75 return str; 76 } catch (IOException e) { 77 e.printStackTrace(); 78 return ""; 79 } 80 } 81 }
测试类:
1 public class PizzaStore { 2 public static void main(String[] args) { 3 String loc = "bj"; 4 if (loc.equals("bj")) { 5 //创建北京口味的各种Pizza 6 new BJOrderPizza(); 7 } else { 8 //创建伦敦口味的各种Pizza 9 new LDOrderPizza(); 10 } 11 } 12 }
标签:void,System,工厂,抽象,println,pizza,第四节,public,Pizza 来源: https://www.cnblogs.com/niujifei/p/14238275.html