建造者模式
建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
我们想要买汽车 - 奥迪A6,去了4S店以后,我们发现这玩意根据不同的套餐价格也是不一样的。车的大体没有改变,但是内部设置却不同了。
奥迪A6 :
20万 配置 沙发和空调
30万 配置 空调和美女
40万 配置 美女和电脑
/**
* Created by malei on 2016/12/5.
*/
public class HuaweiCompany {
private String ceo;
private String cto;
private String cao;
/*构造方法中持有建造者对象
* 导演:管理建造出来的实例的依赖关系。*/
public HuaweiCompany(CompanyBuilder builder){
this.ceo = builder.ceo;
this.cto = builder.cto;
this.cao = builder.cao;
}
/*需要被构建的对象只提供 getter 方法*/
public String getCeo(){
return ceo;
}
public String getCto() {
return cto;
}
public String getCao() {
return cao;
}
/*建造者作为静态内部类使用
* 建造者:创建和提供实例*/
public static class CompanyBuilder{
private String ceo;
private String cto;
private String cao;
/*按需为建造者提供不同的构造方法*/
public CompanyBuilder(String ceo){
this.ceo = ceo;
}
public CompanyBuilder(){
}
/*返回被构建的对象*/
public HuaweiCompany build(){
return new HuaweiCompany(this);
}
/*只提供 setter 方法*/
public CompanyBuilder setCeo(String ceo) {
this.ceo = ceo;
return this;
}
public CompanyBuilder setCto(String cto) {
this.cto = cto;
return this;
}
public CompanyBuilder setCao(String cao) {
this.cao = cao;
return this;
}
}
private void say() {
Log.show("ceo="+ceo + "\ncto="+cto+"\ncao="+cao);
}
public static void main(String[] args){
HuaweiCompany buidler = new CompanyBuilder()
.setCeo("马磊")
.setCto("马云")
.setCao("马化腾").build();
buidler.say();
}
}