一个对象有如下属性
public class Man(){
private String name;
private String sex;
private String mobile;
}
如果要创建这样一个对象创最原始的方法是
Man man = new Man();
如果要设置对象的属性则:
Man.setParam(value);
或在创建时调用有参构造进行赋值
Object obj = new Object(value);
但调用有参构造需要先创建构造方法
public Man(String name){
super();
name = this.name;
}
另外构造方法也有弊端
1.当一个对象创建了有参构造时,原有的无参构造会被取代
如果继续调用无参构造
Man man = new Man();
会有编译时异常 The constructor Man() is undefined;
只能
Man man = new Man(name);
或者新增一个无参构造
public class Man(){
private String name;
private String sex;
private String mobile;
public Man(String name){
super();
name = this.name;
}
public Man(){
}
}
如果通过构造函数对多个属性进行赋值,如果有N个参数,为了能够灵活创建对象,那么需要写n(n-1)/2+1个构造方法才能满足需要。(1是为了无参构造)
当然给对象赋属性除了构造方法外还有Set方法可以赋值
public class Man(){
private String name;
private String sex;
private String mobile;
public Man(){
}
public void setName(String name){
name = this.name; // 这里name与this.name的区别是 前面的name取的是对象中的name属性而this.name则是一个临时变量也就是setName中的参数
}
}
如果有N个参数通过set方法进行赋值,需要写n个set方法。
但是set方法也有个缺点
如果我要给对象赋三个值:
Man man = new Man();
man.setName("张三");
man.setSex("男");
man.setMobile("13212341234");
每次都需要对象.set方法。
对于参数繁多,并且参数必填与非必填不确定因素多的实体,建造者模式是一种更好的选择。
什么是建造者?
建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 --- 来自《百度百科》
建造者模式包含
一个实体(Object):要被创建的对象。
一个接口(BuilderInterface):提供建造方法。
一个实现类(BuilderImplement):为各个属性赋值。
一个建造方法(Buildercontract):用来把各个属性组装成需要的实体。
当你需要用创建者模式创建对象时,也可以用一个内部类当作创建者(简化):
public class Man {
private String name;
private String sex;
private String mobile;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public Man(String name, String sex, String mobile) {
super();
this.name = name;
this.sex = sex;
this.mobile = mobile;
}
public static class builder{
private String name;
private String sex;
private String mobile;
public builder(){
}
public Man.builder setName(String name){
this.name = name;
return this;
}
public Man.builder setSex(String sex){
this.sex = sex;
return this;
}
public Man.builder setMobile(String mobile){
this.mobile = mobile;
return this;
}
public Man buildConstract(){
return new Man(this.name, this.sex, this.mobile);
}
}
}
创建实体代码:
Builder build = new Man.Builder();
Man m = build.setMobile("123").setName("张三").setSex("男").buildConstact();
如果要创建另一个只有名字不同的对象,
Man m2 = build.setName("李四");
建造者模式下,当创建出一个需要的对象后,建造者(build)对象依然存在,可以重复使用,并且不会对已经创建的对象进行修改。
这种模式下缺点也很明显,相比较于构造方式创建对象,建造者模式下创建对象所需要的空间比直接用构造方法多。构造方法创建对象只需要开辟一块空间出来,而构造者需要两块。
当需要批量创建对象时,建造者模式是一种更好的选择。
对比:
创建单个对象所需内存空间: 用构造方法 = 用set方法 < 用建造者模式
创建单个对象的执行速度:用构造方法 > 用set方法 > 用建造者模式
灵活性:用构造方法 < 用set方法 < 用建造者模式
总结:建造者模式下将对象与构造相互分离,对于属性并且非必填的对象可以更加简化创建的流程,对创建相似度高的对象也很方便,但建造者模式下会占用一部分空间,导致性能的下降,如果只是为了创建一个对象,不推荐用建造者模式。
有三个人想要个椅子。
第一个人直接买了一把椅子但是他不喜欢这个颜色,花了50块。(构造)
第二个人自己买钉子,木头做了一把,他很喜欢自己做的这把椅子,但是自己做太累了(set属性),花了50块。(set)
第三个人找个木匠按自己的要求做了一把,成品他很满意,花了100块。(建造者)