博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【秒懂设计模式】建造者模式
阅读量:7189 次
发布时间:2019-06-29

本文共 6746 字,大约阅读时间需要 22 分钟。

 秒懂设计模式——建造者模式

(四)建造者模式

1.先解释一下,什么是建造者模式呢?

【官方定义】将一个复杂对象的构建,与它的表示分离,使得同样的构建过程可以创建不同的表示。

【理解】官方定义过于抽象,让我们把它做一个拆分,分解成四个方面理解

①复杂对象的表示;

②复杂对象的构建过程;

③可分离的通用构建过程,也适用于其它复杂对象的表示;

④适用于一些基本部件不会变,而其组合经常变化的时候。

2.接着,让我们再伴随一个例子,进一步清晰的理解这个定义:

【举例】常去KFC的朋友,一般都会发现,其实它的很多食品组合都能构成套餐,但是它们的包装组合却很少变动,比如:“[盒装]香辣汉堡+[杯装]可乐”是一个套餐;再比如:“[盒装]奥尔良烤腿堡+[杯装]雪顶咖啡”也是一个套餐。

3.我们按照上面所说的4个方面,从建造者的设计角度,分析一下这个例子:

①复杂对象的表示KFC套餐

②复杂对象的构建过程盒装+杯装

③可分离的通用构建过程,也适用于其它复杂对象的表示不同的包装可以放不同的食物

④适用于一些基本部件不会变包装组合不变),而其组合经常变化的时候包装内的食品组合经常变化)。

4.我们准备用Java代码来,以建造者模式来实现这一下这个例子。

Java代码】

①创建食品抽象接口

package com.liyan.builderpattern;/** * 食品抽象产品接口类 * 

Title: FoodModel

* @author Liyan * @date 2017年4月28日 下午2:02:21 */public interface FoodInterface { /**食品名字*/ public String name(); /**食品包装*/ public String packing(); /**食品价格*/ public Double price();}

②创建食品包装抽象接口

package com.liyan.builderpattern;/** * 食品包装类接口 * 

Title: PackingInterface

* @author Liyan * @date 2017年4月28日 下午2:06:40 */public interface PackingInterface { public String pack();}

③创建汉堡抽象类,并实现食品接口,并重写食品包装方法

package com.liyan.builderpattern;/** * 汉堡抽象类 * 

Title: Burger

* @author Liyan * @date 2017年4月28日 下午2:19:39 */public abstract class Burger implements FoodInterface { @Override //名称抽象方法 public abstract String name(); @Override //包装方法 public String packing() { //汉堡用纸盒包装 return new BoxPacking().pack(); } @Override //价格抽象方法 public abstract Double price();}

创建饮料抽象类,并实现食品接口,并重写食品包装方法

package com.liyan.builderpattern;/** * 饮料抽象类 * 

Title: Coke

* @author Liyan * @date 2017年4月28日 下午3:14:12 */public abstract class Drinking implements FoodInterface{ @Override //名称抽象方法 public abstract String name(); @Override //包装方法 public String packing() { //饮料用杯装 return new CupPacking().pack(); } @Override //价格抽象方法 public abstract Double price();}

④创建香辣鸡腿堡具体产品类,并继汉堡类创建饮料抽象类,并实现食品接口,并重写食品包装方法

package com.liyan.builderpattern;/** * 香辣鸡腿堡具体产品类 * 

Title: SpicyChickenBurger

* @author Liyan * @date 2017年4月28日 下午3:39:27 */public class SpicyChickenBurger extends Burger { @Override public String name() { return "香辣鸡腿堡"; } @Override public Double price() { return 16.5; }}

创建奥尔良烤腿堡具体产品类,并继汉堡类

package com.liyan.builderpattern;/** * 奥尔良烤腿堡具体产品类 * 

Title: SpicyChickenBurger

* @author Liyan * @date 2017年4月28日 下午3:39:27 */public class FortRoastedLegOrleans extends Burger { @Override public String name() { return "奥尔良烤腿堡"; } @Override public Double price() { return 18.5; }}

⑤创建可口可乐具体产品类,并继承饮料类

package com.liyan.builderpattern;/** * 可口可乐具体产品类 * 

Title: CocaCola

* @author Liyan * @date 2017年4月28日 下午3:46:57 */public class CocaCola extends Drinking { @Override public String name() { return "中杯可口可乐"; } @Override public Double price() { return 8.5; }}

创建雪顶咖啡具体产品类,并继承饮料类

package com.liyan.builderpattern;/** * 雪顶咖啡具体产品类 * 

Title: IcyTopCoffe

* @author Liyan * @date 2017年4月28日 下午3:48:15 */public class IcyTopCoffe extends Drinking { @Override public String name() { return "雪顶咖啡"; } @Override public Double price() { return 9.5; }}

⑥创建套餐的过程

package com.liyan.builderpattern;import java.util.ArrayList;import java.util.List;/** * 套餐的创建过程 * 

* Title: Package *

* * @author Liyan * @date 2017年4月28日 下午4:08:20 */public class Package { //套餐内的食品集合 private List
foods = new ArrayList
(); /** * 添加食物 *

Title: addFood

* @author Liyan * @date 2017年4月28日 下午4:12:59 * @param food 食物 */ public void addFood(FoodInterface food) { foods.add(food); } /** * 计算价格 *

Title: getCost

* @author Liyan * @date 2017年4月28日 下午4:14:59 * @return float 总价 */ public float getCost() { float cost = 0.0f; for (FoodInterface item : foods) { cost += item.price(); } return cost; } /** * 展示套餐清单 *

Title: showFoods

* @author Liyan * @date 2017年4月28日 下午4:15:23 */ public void showFoods() { for (FoodInterface food : foods) { System.out.print("食物名称 : " + food.name()); System.out.print(", 包装 : " + food.packing()); System.out.println(", 价格 : " + food.price()); } }}

⑦实际套餐的创建者

package com.liyan.builderpattern;/** * 实际套餐的创建者 * 

Title: PackageBuilder

* @author Liyan * @date 2017年4月28日 下午4:17:17 */public class PackageBuilder { /** * 创建套餐一:香辣鸡腿堡+可乐 *

Title: package1

* @author Liyan * @date 2017年4月28日 下午4:20:22 * @return Package */ public Package package1() { Package package1 = new Package(); package1.addFood(new SpicyChickenBurger()); package1.addFood(new CocaCola()); return package1; } /** * 创建套餐二:奥尔良烤腿堡+雪顶咖啡 *

Title: package2

* @author Liyan * @date 2017年4月28日 下午4:21:14 * @return Package */ public Package package2() { Package package2 = new Package(); package2.addFood(new FortRoastedLegOrleans()); package2.addFood(new IcyTopCoffe()); return package2; } /** * 创建套餐三:香辣鸡腿堡+雪顶咖啡 *

Title: package3

* @author Liyan * @date 2017年4月28日 下午4:22:04 * @return Package */ public Package package3() { Package package3 = new Package(); package3.addFood(new SpicyChickenBurger()); package3.addFood(new IcyTopCoffe()); return package3; } /** * 创建套餐四:奥尔良烤腿堡+可乐 *

Title: package4

* @author Liyan * @date 2017年4月28日 下午4:23:19 * @return Package */ public Package package4() { Package package4 = new Package(); package4.addFood(new FortRoastedLegOrleans()); package4.addFood(new CocaCola()); return package4; }}

⑧顾客登场,开始点餐

package com.liyan.builderpattern;/** * 顾客开始点餐 * 

Title: Customer

* @author Liyan * @date 2017年4月28日 下午4:33:00 */public class Customer { public static void main(String[] args) { PackageBuilder packageBuilder = new PackageBuilder(); System.out.println("我是套餐一================"); Package package1 = packageBuilder.package1(); package1.showFoods(); System.out.println("我是套餐二================"); Package package2 = packageBuilder.package2(); package2.showFoods(); System.out.println("我是套餐三================"); Package package3 = packageBuilder.package3(); package3.showFoods(); System.out.println("我是套餐四================"); Package package4 = packageBuilder.package4(); package4.showFoods(); }}

⑨控制台输出结果

我是套餐一================食物名称 : 香辣鸡腿堡, 包装 : 纸盒包装, 价格 : 16.5食物名称 : 中杯可口可乐, 包装 : 杯装, 价格 : 8.5我是套餐二================食物名称 : 奥尔良烤腿堡, 包装 : 纸盒包装, 价格 : 18.5食物名称 : 雪顶咖啡, 包装 : 杯装, 价格 : 9.5我是套餐三================食物名称 : 香辣鸡腿堡, 包装 : 纸盒包装, 价格 : 16.5食物名称 : 雪顶咖啡, 包装 : 杯装, 价格 : 9.5我是套餐四================食物名称 : 奥尔良烤腿堡, 包装 : 纸盒包装, 价格 : 18.5食物名称 : 中杯可口可乐, 包装 : 杯装, 价格 : 8.5

5.分析:以上就是建造者模式的Java实现过程,下面用画图的方式,梳理一下各种关系:

 

我们发现建造者模式有四个角色

Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。(食品抽象接口

ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。(包装抽象接口

Product:要创建的复杂对象。(套餐类

Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。(实际套餐的建造者类

 

你可能感兴趣的文章
HDS存储管理工具命令行汇总
查看>>
Struts2+Hibernate+Spring+Maven3整合(-)
查看>>
环境变量的4种配置方法
查看>>
跨域访问机制和应用程序域
查看>>
Linux
查看>>
我的友情链接
查看>>
linux 文件归档
查看>>
成为Linux大神计划书
查看>>
jmeter压测网站
查看>>
Windows Server 2012正式版RDS系列⑿
查看>>
aix iostat and vmstat
查看>>
网络工具 Netcat 之端口扫描
查看>>
参观迅达云成公司观后感
查看>>
如何在一台服务器上实现多个Web站点
查看>>
ubantu16.04安装配置samba服务(原创)
查看>>
DB2数据库代码页和实例代码页的区别(解决DB2乱码问题)
查看>>
结合超声计数炎症关节的改良版DAS28的临床应用
查看>>
如何用BarTender 2016字处理器完成表格设计
查看>>
JSON数据格式
查看>>
页面引入(include)方式的研究及性能比较
查看>>