Java Builder模式(设计模式之Builder模式)

359 阅读3分钟

1.设计模式之终极结合 昨天项目上线(今年是没有新需求了,那提前祝大家新年快乐),上班继续最近几期博客的编写。承接上一篇博客观察者模式,这一期我们一起来了解一下Builder模式。我们最近几期博客打算主要讲一下单例模式、观察者模式、Build模式,目的是为了方便后期为大家带来RXJava+Retrofit2.0+Okhttp3结合使用的网络请求框架。

思考了一上午,我该怎么写出Builder模式的精华呢?(如果你们有一定要告诉我)

2.Builder模式定义 简单说就是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

3.Builder模式理解 看了定义觉得难以理解,那么说说我的理解。比如说你需要构造一个机器:是不是会包含很多部件,但是根据相同的制造过程可以制作出不同的机器(机器猫,机器狗,机器人,机器*等等)。再比如说相同的注册流程可以注册出不同的公司(百度,华为,小米等等),不同的注册信息可以表示出不同的公司。

然后我们再说说为什么要用Builder模式吧,比如你做个机器人,我们是不是要用很多参数(手,脚,关节,眼睛,嘴巴,鼻子等等)来构造,如果你用一般的构造方法,你觉得你要写多少个构造方法呢?显得特别麻烦,代码还不清晰,传参也麻烦;这样我们就引入了Builder模式。

4.Builder模式简单示例 步骤一:创建一个实体类CompanyClient,里面有个和实体类(只能获取变量值)相同变量的静态内部类Builder(设置变量值) 。在实体类通过构造函数来构造一个Builder,通过调用build()来建造一个具体的实体对象。

/**
 * 实体类 包含一个静态内部类 Builder
 */
public class CompanyClient {
   public final String companyName;
   public final String companyAddress;
 
   public final double companyRegfunds;
   public final String mPerson;
   public final String mType;
 
	
	//构造方法 
    public CompanyClient() {
        this(new Builder());
    }
	
	//构造方法
	public CompanyClient(Builder builder){
        this.companyName = builder.companyName;
        this.companyAddress = builder.companyAddress;
        this.companyRegfunds = builder.companyRegfunds;
        this.mPerson = builder.person;
        this.mType = builder.type;
    }
    public String getCompanyName() {
        return companyName;
    }
 
    public String getCompanyAddress() {
        return companyAddress;
    }
 
    public double getCompanyRegfunds() {
        return companyRegfunds;
    }
 
    public String getmPerson() {
        return mPerson;
    }
 
    public String getmType() {
        return mType;
    }
	
   
	
    public Builder newBuilder() {
        return new Builder(this);
    }
 
    @Override
    public String toString() {
        return "CompanyClient{" +
                "companyName='" + companyName + '\'' +
                ", companyAddress='" + companyAddress + '\'' +
                ", companyRegfunds=" + companyRegfunds +"千万"+
                ", mPerson=" + mPerson +
                ", mType='" + mType + '\'' +
                '}';
    }
	/**
	*静态内部类 Builder
	*/
	
    public static class Builder{
       public String companyName;
       public String companyAddress;
       public  double companyRegfunds;
       public  String person;
       public String type;
	   //构造方法
       public Builder() {
           companyName = companyName;
           companyAddress = companyAddress;
           companyRegfunds = companyRegfunds;
           person = person;
           type = type;
 
       }
	   //构造方法
       Builder(CompanyClient companyClient){
           this.companyName = companyClient.companyName;
           this.companyAddress = companyClient.companyAddress;
           this.companyRegfunds = companyClient.companyRegfunds;
           this.person = companyClient.mPerson;
           this.type = companyClient.mType;
       }
 
       public Builder setCompanyName(String name) {
           companyName = name;
           return this;
       }
 
       public Builder setCompanyAddress(String address) {
           companyAddress = address;
           return this;
       }
 
       public Builder setCompanyRegfunds(double regfunds) {
           companyRegfunds = regfunds;
           return this;
       }
 
       public Builder setmPerson(String per) {
           person = per;
           return this;
       }
 
       public Builder setmType(String typeStr) {
           type = typeStr;
           return this;
       }
		//构建一个实体
        public CompanyClient build() {
            return new CompanyClient(this);
        }
   }
}

步骤二:实现类(TestBuilder)

public class TestBuilder {
 
    public static void main(String[] args) {
 
        CompanyClient client = new CompanyClient.Builder()
                .setCompanyName("百度")
                .setCompanyAddress("海定区百度大厦")
                .setCompanyRegfunds(5)
                .setmPerson("1000人以上")
                .build();
        System.out.println("构造出一个公司:" + client.toString());
 
        System.out.println("---------------------分隔符");
		
        CompanyClient.Builder builder = new CompanyClient.Builder();
        builder.setCompanyName("华为");
        builder.setCompanyAddress("海定区百度大厦");
        builder.setCompanyRegfunds(20);
        builder.setmType("通信科技行业");
        CompanyClient client1 = builder.build();
        System.out.println("构造出另一个公司:" + client1.toString());
    }
}