【秒懂设计模式】建造者模式
来源:互联网 发布:淘宝代充话费怎么弄 编辑:程序博客网 时间:2024/06/13 18:05
秒懂设计模式——建造者模式
(四)建造者模式
1.先解释一下,什么是建造者模式呢?
【官方定义】将一个复杂对象的构建,与它的表示分离,使得同样的构建过程可以创建不同的表示。
【理解】官方定义过于抽象,让我们把它做一个拆分,分解成四个方面理解:
①复杂对象的表示;
②复杂对象的构建过程;
③可分离的通用构建过程,也适用于其它复杂对象的表示;
④适用于一些基本部件不会变,而其组合经常变化的时候。
2.接着,让我们再伴随一个例子,进一步清晰的理解这个定义:
【举例】常去KFC的朋友,一般都会发现,其实它的很多食品组合都能构成套餐,但是它们的包装组合却很少变动,比如:“[盒装]香辣汉堡+[杯装]可乐”是一个套餐;再比如:“[盒装]奥尔良烤腿堡+[杯装]雪顶咖啡”也是一个套餐。
3.我们按照上面所说的4个方面,从建造者的设计角度,分析一下这个例子:
①复杂对象的表示:KFC套餐;
②复杂对象的构建过程:盒装+杯装;
③可分离的通用构建过程,也适用于其它复杂对象的表示:不同的包装可以放不同的食物;
④适用于一些基本部件不会变(包装组合不变),而其组合经常变化的时候(包装内的食品组合经常变化)。
4.我们准备用Java代码来,以建造者模式来实现这一下这个例子。
【Java代码】
①创建食品抽象接口
package com.liyan.builderpattern;/** * 食品抽象产品接口类 * <p>Title: FoodModel</p> * @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;/** * 食品包装类接口 * <p>Title: PackingInterface</p> * @author Liyan * @date 2017年4月28日 下午2:06:40 */public interface PackingInterface {public String pack();}
③创建汉堡抽象类,并实现食品接口,并重写食品包装方法
package com.liyan.builderpattern;/** * 汉堡抽象类 * <p>Title: Burger</p> * @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;/** * 饮料抽象类 * <p>Title: Coke</p> * @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;/** * 香辣鸡腿堡具体产品类 * <p>Title: SpicyChickenBurger</p> * @author Liyan * @date 2017年4月28日 下午3:39:27 */public class SpicyChickenBurger extends Burger {@Overridepublic String name() {return "香辣鸡腿堡";}@Overridepublic Double price() {return 16.5;}}
创建奥尔良烤腿堡具体产品类,并继汉堡类
package com.liyan.builderpattern;/** * 奥尔良烤腿堡具体产品类 * <p>Title: SpicyChickenBurger</p> * @author Liyan * @date 2017年4月28日 下午3:39:27 */public class FortRoastedLegOrleans extends Burger {@Overridepublic String name() {return "奥尔良烤腿堡";}@Overridepublic Double price() {return 18.5;}}
⑤创建可口可乐具体产品类,并继承饮料类
package com.liyan.builderpattern;/** * 可口可乐具体产品类 * <p>Title: CocaCola</p> * @author Liyan * @date 2017年4月28日 下午3:46:57 */public class CocaCola extends Drinking {@Overridepublic String name() {return "中杯可口可乐";}@Overridepublic Double price() {return 8.5;}}
创建雪顶咖啡具体产品类,并继承饮料类
package com.liyan.builderpattern;/** * 雪顶咖啡具体产品类 * <p>Title: IcyTopCoffe</p> * @author Liyan * @date 2017年4月28日 下午3:48:15 */public class IcyTopCoffe extends Drinking {@Overridepublic String name() {return "雪顶咖啡";}@Overridepublic Double price() {return 9.5;}}
⑥创建套餐的过程
package com.liyan.builderpattern;import java.util.ArrayList;import java.util.List;/** * 套餐的创建过程 * <p> * Title: Package * </p> * * @author Liyan * @date 2017年4月28日 下午4:08:20 */public class Package {//套餐内的食品集合private List<FoodInterface> foods = new ArrayList<FoodInterface>(); /** * 添加食物 * <p>Title: addFood</p> * @author Liyan * @date 2017年4月28日 下午4:12:59 * @param food 食物 */public void addFood(FoodInterface food) {foods.add(food);}/** * 计算价格 * <p>Title: getCost</p> * @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;}/** * 展示套餐清单 * <p>Title: showFoods</p> * @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;/** * 实际套餐的创建者 * <p>Title: PackageBuilder</p> * @author Liyan * @date 2017年4月28日 下午4:17:17 */public class PackageBuilder {/** * 创建套餐一:香辣鸡腿堡+可乐 * <p>Title: package1</p> * @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;}/** * 创建套餐二:奥尔良烤腿堡+雪顶咖啡 * <p>Title: package2</p> * @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;}/** * 创建套餐三:香辣鸡腿堡+雪顶咖啡 * <p>Title: package3</p> * @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;}/** * 创建套餐四:奥尔良烤腿堡+可乐 * <p>Title: package4</p> * @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;/** * 顾客开始点餐 * <p>Title: Customer</p> * @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:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。(实际套餐的建造者类)
- 【秒懂设计模式】建造者模式
- 设计模式-------建造者
- 设计模式-建造者
- 建造者设计模式
- 建造者设计模式
- 建造者设计模式
- 设计模式-建造者
- 建造者设计模式
- 建造者设计模式
- 建造者设计模式
- [设计]建造者模式
- 设计模式:建造者模式
- 设计模式---建造者模式
- 设计模式---建造者模式
- 设计模式-----建造者模式
- 设计模式-【建造者模式】
- 设计模式--建造者模式
- 设计模式建造者模式
- Window 7下安装python等
- itk反向配准失败的问题
- Shader编程学习笔记(九)—— Cg语言入门1
- iOS开发学习专题-基础知识(二)NSArray数组NSMutableArray可变数组NSSet集合NSMutableSet可变集合详细使用方式
- IO流中遍历目录下的所有子文件和文件夹
- 【秒懂设计模式】建造者模式
- Asp.net中web.config配置文件详解(原文:http://blog.csdn.net/hbqhdlc/article/details/8164521)
- intellij idea让资源文件自动更新
- Shader编程学习笔记(十)—— Cg语言入门2
- Spring事务管理
- CodeWars 计算一个城市的降雨量
- 闷骚程序员有感
- nginx+keepalived+lvs负载均衡之高可用
- 米画师——快速雇佣画师平台