假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
介绍
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
建造者模式,又称生成器模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
三个角色:建造者、具体的建造者、监工、使用者(严格来说不算)
- 建造者角色:定义生成实例所需要的所有方法;
- 具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
- 监工角色:定义使用建造者角色中的方法来生成实例的方法;
- 使用者:使用建造者模式。
注意:定义中“将一个复杂的构建过程与其表示相分离”,表示并不是由建造者负责一切,而是由监工负责控制(定义)一个复杂的构建过程,由各个不同的建造者分别负责实现构建过程中所用到的所有构建步骤。不然,就无法做到“使得同样的构建过程可以创建不同的表示”这一目标。
建造者角色
package com.suning.builder.builder1;public abstract class Builder { public abstract void buildPart1(); public abstract void buildPart2(); public abstract void buildPart3();}
具体的建造者角色
package com.suning.builder.builder1;/** * 此处实现了建造纯文本文档的具体建造者。 * 可以考虑再实现一个建造HTML文档、XML文档,或者其它什么文档的具体建造者。 * 这样,就可以使得同样的构建过程可以创建不同的表示 */public class ConcreteBuilder1 extends Builder { private StringBuffer buffer = new StringBuffer();//假设 buffer.toString() 就是最终生成的产品 @Override public void buildPart1() { //实现构建最终实例需要的所有方法 buffer.append("Builder1 : Part1\n"); } @Override public void buildPart2() { buffer.append("Builder1 : Part2\n"); } @Override public void buildPart3() { buffer.append("Builder1 : Part3\n"); } public String getResult() { //定义获取最终生成实例的方法 return buffer.toString(); }}
监工者
package com.suning.builder.builder1;public class Director { // 将一个复杂的构建过程与其表示相分离 private Builder builder; // 针对接口编程,而不是针对实现编程 public Director(Builder builder) { this.builder = builder; } public void setBuilder(Builder builder) { this.builder = builder; } public void construct() { // 控制(定义)一个复杂的构建过程 builder.buildPart1(); for (int i = 0; i < 5; i++) { // 提示:如果想在运行过程中替换构建算法,可以考虑结合策略模式。 builder.buildPart2(); } builder.buildPart3(); }}
调用者:
package com.suning.builder.builder1;/** * * @author 88403097 * @date 2018年11月6日 * @version 10.28版本 * @说明:建造者模式,又称生成器模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。三个角色:建造者、具体的建造者、监工、使用者(严格来说不算) 建造者角色:定义生成实例所需要的所有方法; 具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法; 监工角色:定义使用建造者角色中的方法来生成实例的方法; 使用者:使用建造者模式 注意:定义中“将一个复杂的构建过程与其表示相分离”,表示并不是由建造者负责一切, 而是由监工负责控制(定义)一个复杂的构建过程,由各个不同的建造者分别负责实现构建过程中所用到的所有构建步骤。 不然,就无法做到“使得同样的构建过程可以创建不同的表示”这一目标。 */public class Client { public static void main(String[] args) { ConcreteBuilder1 b1 = new ConcreteBuilder1();// 建造者 Director director = new Director(b1);// 监工 director.construct();// 建造实例(监工负责监督,建造者实际建造) String result = b1.getResult();// 获取最终生成结果 System.out.printf("the result is :%n%s", result); }}
the result is :
Builder1 : Part1Builder1 : Part2Builder1 : Part2Builder1 : Part2Builder1 : Part2Builder1 : Part2Builder1 : Part3
ff