建造者模式(Builder Pattern)
建造者模式:使用多个简单对象一步步构建成一个复杂的对象。
有时候,我们会创建一个“复杂”的对象,这个对象的由很多子对象构成,由于需求的变化,这个对象的各个部分经常面临剧烈的变化。
继续工厂模式的披萨店案例,现在披萨店要推出套餐服务,一个套餐(Meal)包含:披萨、饮料,披萨可以是芝士披萨(Cheese Pizza)、素食披萨(Veggie Pizza)等,披萨是包在盒子(Box)里,饮料可以是可口可乐(Coke)、橙汁(Orange)等,饮料装在杯子(Cup)里。
我们将创建一个表示食物的条目(包括披萨和饮料)的Item接口和实现Item接口的实体类(Pizza和Drink),以及一个表示装食物容器的Packing接口和实现Packing接口的实体类(Box和Cup),然后创建一个Meal类,该类有一个Item类型的ArrayList来放入套餐,以及一个MealBuilder来提供不同套餐。
Item.java
public interface Item {
public String name();
public Packing packing();
public float price();
}
Packing.java
public interface Packing {
public String pack();
}
Box实现Packing容器接口
public class Box implement Packing {
public String pack() {
return "Box";
}
}
Cup同样实现Packing容器接口
public class Cup implements Packing {
public String pack() {
return "Bottle";
}
}
Pizza实现Item接口,声明为抽象类,因为有不同种类的Pizza
public abstract class Pizza implements Item {
public Packing packing() {
return new Box();
}
public abstract float price();
}
Drink实现Item接口,声明为抽象类,因为有不同种类的Drink
public abstract class Drink implements Item {
public Packing packing() {
return new Cup();
}
public abstract float price();
}
CheesePizza.java,Veggie就不写了,跟CheesePizza一样
public CheesePizza extends Pizza {
public float price() {
return 20.0f;
}
public String name() {
return "Cheese Pizza";
}
}
Coke.java,Orange就不写了,跟Coke一样
public class Coke extends Drink {
public float price() {
return 7.0f;
}
public String name() {
return "Coke";
}
}
Meal.java
public class Meal {
private List<Item> items = new ArrayList<Item>();
public void addItem(Item item) {
items.add(item);
}
public float getCost() {
float cost = 0.0f;
for(Item item : items) {
cost += item.price();
}
return cost;
}
public void showItems() {
for(Item item : items) {
System.out.print("Item :" + item.name());
System.out.print(",Packing : :" + item.packing());
System.out.println(",Price :" + item.price());
}
System.out.printlln("Total cost :" + this.getCost());
}
}
MealBuilder.java负责创建Meal对象
public class MealBuilder {
public Meal prepareCheesePizza() {
Meal meal = new Meal();
meal.addItem(new CheesePizza());
meal.addItem(new Coke());
return meal;
}
public Meal prepareVeggiePizza() {
Meal meal = new Meal();
meal.addItem(new VeggiePizza());
meal.addItem(new Orange());
return meal;
}
}
工作已经完成,可以使用MealBuilder了
public static void main(String[] args) {
MealBuilder mb = new MealBuilder();
Meal cheesePizza = mealBuilder.prepareCheesePizza();
System.out.println("Cheese Pizza");
cheesePizza.showItem();
Meal veggiePizza = mealBuilder.prepareVeggiePizza();
veggiePizza.showItem();
}

建造者模式(Builder Pattern)的更多相关文章
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- 建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- Net设计模式实例之建造者模式(Builder Pattern)
一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
- 设计模式 - 建造者模式 Builder Pattern
简介 场景 在创建复杂对象时,用户无须关心该对象所包含的属性以及它们的组装方式,只需要指定复杂对象的类型和内容就可以构建它们. 模式定义 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程 ...
随机推荐
- powershell.exe直接运行命令
powershell.exe -Command "& { ('time={0},user={1}' -f (get-date),(whoami)) | Out-File " ...
- Ubuntu下安装Nginx,PHP5(及PHP-FPM),MySQL
.简介: Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱.虽然Tomcat的最新版本支持epoll,但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很多 ...
- Clover
为您的 Windows Explorer 插上翅膀! Clover 是 Windows Explorer 资源管理器的一个扩展,为其增加类似谷歌 Chrome 浏览器的多标签页功能. 方便的 Tab ...
- (转)如何在JavaScript与ActiveX之间传递数据2
本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口.使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等.本文将研 ...
- requestCode 和 resultCode .
OK,代码如上,可能这个时候还会有点疑问,关于参数的疑问.直接看android sdk 帮助说得更清楚.我发现网上有些文章还有吧 requestCode 和 resultCode 混淆说明错的. st ...
- php面试常用算法
这些都是真实的IT公司招聘PHP程序员的面试题,这些都是简单的基本算法.包括:冒泡算法.快速排序算法.二分查找算法.顺序算法. 冒泡排序,对象可以是一个数组 01 function bubble_so ...
- 如何强化 TCP/IP 堆栈
TCP/IP 是一种本质上不安全的协议.但是,Windows 2000 实现可以使您配置其操作以防止网络的拒绝服务攻击.默认情况下,本文中所涉及的一些项和值可能并不存在.在这些情况下,请创建该项.值或 ...
- 配置opencv
先把opencv配置起来: 详细参见: http://blog.163.com/chen_dawn/blog/static/1125063201461695238801/ 我的机器的配置方法: 先去环 ...
- posix thread概述(示例代码)
一个简单的alarm实例 errors.h头文件 #ifndef __ERRORS_H #define __ERORRS_H #include<stdio.h> #include<u ...
- 浅析PAC,教你动手修改你的PAC文件及user-rule文件实现自动代理
Shadowsocks作为现在一种很流行的穿墙工具,以其轻量级.速度感人等优点深受广大网友热捧.与VP_N相比,他就像一把锋利的”瑞士军刀”,不用受制于“系统全局代理”模式的困扰,控制更加便捷,基于S ...