定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,同时可以分步的构造每一部分。
看起来比较抽象,也不知道具体是什么意思?下面我举一个例子,通过代码来看看什么是建造者模式
举例:
public class ImageBean { private int id; //图片id private String path; //图片路径 private long size; //图片大小 private String type; //图片类型 public ImageBean() { } public ImageBean(int id, String path, long size, String type) { this.id = id; this.path = path; this.size = size; this.type = type; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } public String getType() { return type; } public void setType(String type) { this.type = type; } }
我们定义了一个ImageBean实体,里面包含id、path、size、type属性,其中还包含空的构造方法和一个包含参数的构造。这样我们在声明这个实体的时候可以给这个实体赋值。
码的可读性并不高,如果不是你自己写的,别人根本看不懂,即便是自己写的,时间长了的话恐怕我们也都忘了。那么Builder模式就可以解决这种情况。
我们可以给ImageBean建立一个Builder:
public class ImageBean { private int id; //图片id private String path; //图片路径 private long size; //图片大小 private String type; //图片类型 public ImageBean() { } public ImageBean(Builder builder) { this.id = builder.id; this.path = builder.path; this.size = builder.size; this.type = builder.type; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } public String getType() { return type; } public void setType(String type) { this.type = type; } public static class Builder{ private int id; private String path; private long size; private String type; public Builder id(int id){ this.id = id; return this; } public Builder path(String path){ this.path = path; return this; } public Builder size(long size){ this.size = size; return this; } public Builder type(String type){ this.type = type; return this; } public ImageBean build(){ return new ImageBean(this); } } }
ImageBean.Builder builder = new ImageBean.Builder(); ImageBean ib = builder.id(11).path("xxx").size(1111).type("jpg").build();
可以看到ImageBean的构造参数改成了这个builder,然后定义了一个和ImageBean一样的Builder,返回值都是builder对象。这就是定义里面说的构造和表示分离,构造是ImageBean中来构造,而显示则在Builder中显示。也就是分布构造每一部分。
以上只是builder设计模式的一种用法
总结:
在以下情况使用Build模式:
1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2 当构造过程必须允许被构造的对象有不同的表示时。
3 Builder模式要解决的也正是这样的问题:
当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),
我们要复杂对象的创建过程和这个对象的表示(展示)分离开来,
这样做的好处就是通过一步步的进行复杂对象的构建,
由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。
优缺点:
优点:在使用builder的时候,让设置每个属性之后返回他自己本身,这样子可以采用链接的变成风格,使用起来更加方便快捷,具体部分可以参考红色字体部分.
缺点:当然,你也看到了,在使用构建器的时候,必须利用另外一个类来实例化另外一个类,这样子会使创建的时候创建更多的对象。这样子会损耗一定的性能...不过带来的好处是非常明显的。因为使用builder模式,每次设置属性的时候,都是具名的方法操作,是开发人员更容易使用,并且不需要给宿主类增加相应的setXxx方法,这样子,这个宿主类在创建之后是不可以修改的,在一些安全模式比较高的程序中,这点也是很重要的