Builder-Mode-Practice

根据上述要求来用建造者模式设计程序。我将程序放在了https://github.com/RoyalBob/Builder-Mode-Practice.git   欢迎访问。

以下是本程序的UML图以及代码:

1、创建一个创造套餐的建造者接口IMealBuilder

1 public interface IMealBuilder {
2
3     public void BuildBurger();
4     public void BuildChips();
5     public void BuildDrink();
6     Meal GetMeal();
7 }

2、编写Meal类用来存放建造者需要建造的食物。

 1 public class Meal
 2 {
 3     private  List<IFood> foodList=new ArrayList<IFood>();
 4     public void addFood( IFood food )
 5     {
 6         foodList.add(food);
 7     }
 8     public void Show()
 9     {
10         for (int i=0; i<foodList.size(); i++)
11         {
12             foodList.get(i).Make();
13         }
14     }
15 }

3、分别创建肯德基、麦当劳两家店的建造者KFCBuilder、McDonaldBuilder,这两家店都有相似套餐:汉堡+薯条+饮料,但是产品不同。所以都继承同样的建造过程IMealBuilder

以下是肯德基的建造者KFCBuilder:

 1 public class KFCBuilder implements IMealBuilder
 2 {
 3     protected Meal meal=new Meal();
 4     @Override
 5     public void BuildBurger() {
 6         // TODO Auto-generated method stub
 7         IFood food = new KFCBurger();
 8         meal.addFood(food);
 9     }
10
11     @Override
12     public void BuildChips() {
13         // TODO Auto-generated method stub
14         IFood food = new KFCChips();
15         meal.addFood(food);
16     }
17
18     @Override
19     public void BuildDrink() {
20         // TODO Auto-generated method stub
21         IFood food = new KFCDrink();
22         meal.addFood(food);
23     }
24
25     @Override
26     public Meal GetMeal() {
27         // TODO Auto-generated method stub
28         return meal;
29     }
30 }

以下是麦当劳的建造者McDonaldBuilder:

 1 public class McDonaldBuilder implements IMealBuilder{
 2
 3     protected Meal meal=new Meal();
 4     @Override
 5     public void BuildBurger() {
 6         // TODO Auto-generated method stub
 7         IFood food = new McDonaldBurger();
 8         meal.addFood(food);
 9     }
10
11     @Override
12     public void BuildChips() {
13         // TODO Auto-generated method stub
14         IFood food = new McDonaldChips();
15         meal.addFood(food);
16     }
17
18     @Override
19     public void BuildDrink() {
20         // TODO Auto-generated method stub
21         IFood food = new McDonaldDrink();
22         meal.addFood(food);
23     }
24
25     @Override
26     public Meal GetMeal() {
27         // TODO Auto-generated method stub
28         return meal;
29     }
30 }

4、创建一个指挥者MealDirector用来负责控制产品的创建过程。

 1 public class MealDirector{
 2
 3     private IMealBuilder _builder;
 4     public MealDirector( IMealBuilder builder )
 5     {
 6         _builder = builder;
 7     }
 8     public Meal CreateMeal()
 9     {
10         _builder.BuildBurger();
11         _builder.BuildChips();
12         _builder.BuildDrink();
13
14         return _builder.GetMeal();
15     }
16 }

5、创建一个食物的接口IFood,具有制作食物的方法Make()。

1 public interface IFood{
2
3     public abstract void Make();
4 }

6、分别编写肯德基、麦当劳各种食品的制作方法,以输出为反馈。

1 public class KFCBurger implements IFood {
2
3     @Override
4     public void Make() {
5         // TODO Auto-generated method stub
6         System.out.println("KFC汉堡做好了!");
7     }
8
9 }

KFCBurger

1 public class KFCChips implements IFood {
2
3     @Override
4     public void Make() {
5         // TODO Auto-generated method stub
6         System.out.println("KFC薯条做好了!");
7     }
8
9 }

KFCChips

1 public class KFCDrink implements IFood {
2
3     @Override
4     public void Make() {
5         // TODO Auto-generated method stub
6         System.out.println("KFC饮料做好了!");
7     }
8
9 }

KFCDrink

1 public class McDonaldBurger implements IFood {
2
3     @Override
4     public void Make() {
5         // TODO Auto-generated method stub
6         System.out.println("McDonald汉堡做好了!");
7     }
8
9 }

McDonaldBurger

1 public class McDonaldChips implements IFood {
2
3     @Override
4     public void Make() {
5         // TODO Auto-generated method stub
6         System.out.println("McDonald薯条做好了!");
7     }
8
9 }

McDonaldChips

1 public class McDonaldDrink implements IFood {
2
3     @Override
4     public void Make() {
5         // TODO Auto-generated method stub
6         System.out.println("McDonald饮料做好了!");
7     }
8
9 }

McDonaldDrink

7、书写主函数Main来分别创建肯德基和麦当劳的建造者和指挥者,来制作各自的套餐。

 1 public class Main {
 2
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         IMealBuilder builder1 = new KFCBuilder();
 6         MealDirector director1 = new MealDirector(builder1);
 7         director1.CreateMeal().Show();;
 8
 9         IMealBuilder builder2 = new McDonaldBuilder();
10         MealDirector director2 = new MealDirector(builder2);
11         director2.CreateMeal().Show();
12     }
13
14 }

输出结果看是否符合要求:

时间: 2024-11-03 22:18:38

Builder-Mode-Practice的相关文章

实战生成器模式(Builder Pattern In Practice)

原文链接:http://www.javacodegeeks.com/2013/01/the-builder-pattern-in-practice.html 我不会详细介绍这个模式,因为已经有大量的文章或者书籍对该模式进行过详细的解析.我将告诉你的是为什么以及什么时候你应该考虑使用它.值得一提的是,我所介绍的这个模式和设计模式四人帮的书(<设计模式:可复用面向对象软件的基础>)里面的有些许区别.四人帮书里面介绍的生成器模式重点在抽象出对象创建的步骤,并通过调用不同的具体实现从而得到不同的结果,

设计模式之七:建造模式(Builder Pattern)

建造者模式就是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示. 适用范围: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不同表示时. 建造者模式里面有四个角色: Builder: 给出一个抽象接口,以规范产品对象的各个组成部分的建造.一般而言,此接口独立于应用程序的业务逻辑.模式中直接创建产品对象的具体创建者角色.具体创建者角色必须实现这个接口的所有方法:一个是建造方法,另一个是结果返还方法. ConcreteBu

hdu 1094 A+B for Input-Output Practice (VI)

A+B for Input-Output Practice (VI) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 63087    Accepted Submission(s): 42387 Problem Description Your task is to calculate the sum of some integers.

使用Builder模式进行美化代码

在很多情况下我们需要定义一个Class且里面有很多成员变量的时候通常我们的写法是 class Person { private String name; private int age; private int sex; private int high; private int face; private int weight; private int foot; public Person() {...} public Person(String name) {...} ... public

建造者模式(Builder)

定义 (本人在阅读完本书的中英两个版本之后发现对建造者模式十窍懂了九窍,所以直接去网上搜别人的分析了,所以本章大部分是根据网上的资料收集来的,此外,代码例子表示本书的例子不合适,也换了,所以本章和这本书关系不大.) 建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.建造者模式最重要的两个角色:抽象建造者(Builder)和指导者(Director),其中建造者知道怎么(How)去建造产品,而指导者知道去制造什么(What)产品,建造者模式用建房子的例子来说明

设计模式之建造者(Builder)模式

意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以表示不同的表示. 适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不同的表示时. UML图 Builder --为创建一个Product对象的各个部件指定抽象接口. ConcreteBuilder --实现Builder的接口以构造和装配该产品的各个部件. --定义并明确它所创建的表示. --提供一个检索产品的接口. Director --构造一个使用Builder接口的

Builder模式详解及其在Android开发中的应用

一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比如说在一些常用的第三方库中也随处可见其踪迹,比如说一些常用的网络请求库如OkHttp或者是retrofit,又或者是图片加载库Glide中也不缺乏它的应用. 为什么Builder模式在Android或是Java开发中这么火呢?因为它相较于构造函数或者是Get/Set方法,它的灵活性和封装性上都比较有

JavaFX Scene Builder 使用基础(一)

怎么用Scene Builder 来配合编写一个程序?下面我们就以此来讨论一下. (一)基础准备工作 本人使用NetBeans与JavaFX Scene Builder协同编写. 对于NetBeans我们需要做的是如下步骤:文件-->新建项目-->JavaFX-->JavaFX FXML应用程序,然后单击下一步,如图: 建立好工程文件后,我们可以看到工程下有三个文件,一个.FXML文件,两个.java文件,如图: 其中FXMLDocument.fxml为用户界面,我们可以通过JavaFX

Flash Builder 4.7 注册机完美激活方法

Flash Builder 4.7 破解注册方法目前较为通用的三种方法: 第一种:三步修改配置文件方法,这种有开发者反应这种方法在升级和创建纯 AS 项目时会存在问题,但我懒的去试这种方法的主要原因是它太麻烦了. 第二种:利用 CS6 版的通用破解补丁文件 amtlib.dll 替换方法,这种方法倒是挺简单,但有开发者反应说这种方法会导致启动软件时间变长,我在第一次安装 FB4.7 时就是用了这种方法,不过我并没有在意过它的启动时间是否变长了,因为 FB 本身就是基于 Eclipse 的,JAV

每天一个设计模式-7 生成器模式(Builder)

每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,Xml等具体的格式. 导出成文本或Xml等格式的数据时,一般都会有各自的格式,比如:导出的文件都有3个部分,文件头,内容,尾. 二.问题分析 无论哪种导出格式,都需要3个部分,文件头,内容,尾等信息,并且他们的内容相同.即他们的构造算法固定,只是生成的结果不同:能不能把算法(构建)和结果(外观)分离出