目录
Builder 构造器模式
目录
[TOC]
1. 概述
1.1. Head First设计模式定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
1.2. 自我理解
其核心思想是将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。
为了将复杂对象的构建过程与它的部件分离。注意: 是解耦过程和部件。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
在创建者模式中,客户端不再负责对象的创建与组装,而是把这个对象创建的责任交给其具体的创建者类,把组装的责任交给组装类,客户端只负责对象的调用,从而明确了各个类的职责。
虽然利用创建者模式可以创建出不同类型的产品,但是如果产品之间的差异巨大,则需要编写多个创建者类才能实现,如果这是结合工厂模式更好。
1.3. 构造器模式的组成
Product: 具体的对象,需要构造者。
Builder: 构造器接口,提供了Product中不同字段设置方法,可以获取Product
ConcreteBuilder: 具体构造器,实现了Builder。对Product中字段进行业务逻辑处理,实例化Product。
Director: 面向Builder接口,可以控制复杂构建步骤。
2. UML
3. Example
3.1. 场景
现在有个类,每个业务平台调用前的校验或者字段转换工作不一样,从而在调用端做了大量的工作,而工作中又有重复的校验或者转换业务。那么此时构造器模式大展身手。
3.2. Builder设计模式的代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
public class BuilderPatternDemo { public static void main(String[] args) { Director director = new Director(new ConcreteBuilder()); Product product = director.build("fieldA", "fieldB", "fieldC"); System.out.println(product); } static class Product{ private String fieldA; private String fieldB; private String fieldC; public String getFieldA() { return fieldA; } public void setFieldA(String fieldA) { this.fieldA = fieldA; } public String getFieldB() { return fieldB; } public void setFieldB(String fieldB) { this.fieldB = fieldB; } public String getFieldC() { return fieldC; } public void setFieldC(String fieldC) { this.fieldC = fieldC; } @Override public String toString() { return "Product{" + "fieldA='" + fieldA + '\'' + ", fieldB='" + fieldB + '\'' + ", fieldC='" + fieldC + '\'' + '}'; } } interface Builder { void fieldAHandler(String str); void fieldBHandler(String str); void fieldCHandler(String str); Product create(); } static class ConcreteBuilder implements Builder{ Product product = new Product(); public void fieldAHandler(String str) { System.out.println("check fieldA"); product.setFieldA(str); } public void fieldBHandler(String str) { System.out.println("check fieldB"); product.setFieldB(str); } public void fieldCHandler(String str) { System.out.println("check fieldC"); product.setFieldC(str); } public Product create() { return product; } } static class Director { private Builder builder; public Director(Builder builder){ this.builder = builder; } public Product build(String fieldA, String fieldB, String fieldC){ builder.fieldAHandler(fieldA); builder.fieldBHandler(fieldB); builder.fieldCHandler(fieldC); return builder.create(); } } } |
3.3. 优化过后的构造器
现在基本上流行的一些开源框架,构造器模式的运用,一般都是下面这种变种模式。不需要Director来调用构造器了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
public class OptimizedPatternDemo { public static void main(String[] args) { Product product = new ConcreteBuilder() .fieldAHandler("fieldA") .fieldBHandler("fieldB") .fieldCHandler("fieldC") .create(); System.out.println(product); } static class Product{ private String fieldA; private String fieldB; private String fieldC; public String getFieldA() { return fieldA; } public void setFieldA(String fieldA) { this.fieldA = fieldA; } public String getFieldB() { return fieldB; } public void setFieldB(String fieldB) { this.fieldB = fieldB; } public String getFieldC() { return fieldC; } public void setFieldC(String fieldC) { this.fieldC = fieldC; } @Override public String toString() { return "Product{" + "fieldA='" + fieldA + '\'' + ", fieldB='" + fieldB + '\'' + ", fieldC='" + fieldC + '\'' + '}'; } } interface Builder { Builder fieldAHandler(String str); Builder fieldBHandler(String str); Builder fieldCHandler(String str); Product create(); } static class ConcreteBuilder implements Builder{ Product product = new Product(); public Builder fieldAHandler(String str) { System.out.println("check fieldA"); product.setFieldA(str); return this; } public Builder fieldBHandler(String str) { System.out.println("check fieldB"); product.setFieldB(str); return this; } public Builder fieldCHandler(String str) { System.out.println("check fieldC"); product.setFieldC(str); return this; } public Product create() { return product; } } } |
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/java/designpattern/builder-designpattern.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。