ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第四节:抽象工厂模式

2021-01-05 22:01:05  阅读:202  来源: 互联网

标签:void System 工厂 抽象 println pizza 第四节 public Pizza


一、抽象工厂模式

  基本介绍

    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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有