当我们创建对象的时候,往往会使用构造方法进行创建,但是如果这个对象很复杂,在创建过程中有很多属性需要赋值,这是你是不是会被构造方法中的参数搞得晕头转向。这时候使用创建者模式,可以优雅的解决这个问题。
创建者模式就是把对象的创建与对象的设计进行分离。不关心如何创建对象,只使用创建器去设计自己的对象。
代码举例:
package com.designPattern.builder;
/**
* 我是复杂对象
*/
public class ComplexBean {
private String name ;
private String age ;
private String job ;
public ComplexBean() {
}
/**
* 这里私有构造方法,防止外部调用,只能使用制定的创建器来创建对象
* ComplexBeanBuilder
* @param complexBean
*/
private ComplexBean(ComplexBean complexBean) {
this.name = complexBean.name;
this.age = complexBean.age;
this.job = complexBean.job;
}
/**
* get set 方法
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
/**
* 创建器内部类 这里为什么是内部类?
* 其实外部类也是可以的,只不过外部类,由于存在成员变量
* complexBean 因此有线程安全问题。
*/
public static class ComplexBeanBuilder{
private ComplexBean complexBean ;
public ComplexBeanBuilder() {
//这里也可以使用方法 初始化对象。
// 比如 在类中新加方法 create(){
//this.complexBean = new ComplexBean();}
this.complexBean = new ComplexBean();
}
/**
*返回 当前对象,this代表 这个内部类的对象。
*/
public ComplexBeanBuilder setName(String name ){
complexBean.name = name;
return this ;
}
public ComplexBeanBuilder setAge(String job ){
complexBean.job = job;
return this ;
}
public ComplexBeanBuilder setJob(String job ){
complexBean.job = job;
return this ;
}
/**
*最终产生对象
*/
public ComplexBean build(){
return new ComplexBean(complexBean);
}
}
/**
*方便测试
*/
@Override
public String toString() {
return "ComplexBean{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", job='" + job + '\'' +
'}';
}
}
测试:
package com.designPattern.builder;
public class Test {
public static void main(String [] args){
//内部类的方式
ComplexBean complexBean = new ComplexBean.ComplexBeanBuilder()
//通过创建器进行创建对象,非常明确每个参数,避免复杂代码
.setAge("15").setJob("progremer").setName("TOM").build();
System.out.println(complexBean );
}
}