1. 程式人生 > 其它 >設計模式-構建者(Builder)模式詳解

設計模式-構建者(Builder)模式詳解

技術標籤:設計模式設計模式構建者模式java

前言

在建立一個物件的時候,你是否是醬紫寫:

Student();
Student(String name);
Student(String name,int age);
Student(String name,int age,String address);
Student(String name,int age,String address,String id);

又或者是醬紫寫:

Student stu = Student();
stu.setName("小明");
stu.setAge(18);

上面的寫法雖然效率高,但是也有一些不足,對於程式碼後期維護和協同開發會是一件很痛苦的事情。

再看看別人是醬紫寫的:

Student stu = new Student.Builder("小明")
  					     .setAge(22)
						 .setAddress("青島")
  						 .build();
System.out.println(stu);

是不是很優雅,而且在很多框架中也能看到這樣寫的身影。沒錯這就是接下來要講的構建者模式,這樣好處是易於擴充套件和類的使用,但同時也失去了一些效率。

構建者模式
構建者模式例項程式碼也沒啥好講的,大家記住,照著寫就行,程式碼如下:

public class Student {
    private final String name;
    private int age;
    private String address;

    private Student(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getAddress() {
        return address;
    }


    public static class Builder {
    	//假設名字是必傳,並且不會變,我們設定成final
        private final  String name ; 
        private int age ;
        private String address ;

        //物件中如果有必傳引數,應該寫在這個地方。
        public Builder(String name) {
            this.name = name;
        }

        public Builder setAge(int age) {
            this.age = age;
            return this;
        }

        public Builder setAddress(String address) {
            this.address = address;
            return this;
        }

        public Student build() {
            return new Student(this);
        }
    }
}

使用方法如下:

Student student = new Student.Builder("小明") // 這個地方要傳的引數往往都是必傳引數。
							 .setAge(12)
							 .setAddress("青島")
							 .build();

注意
Builder內部類中的屬性要和Student中的相同。
如果Student中屬性有final修飾,Builder對應的屬性也需要用final修飾。
並且內部類中構造方法,傳入必傳屬性

結尾

是不是看上去逼格瞬間上去了,非必傳屬性可以根據需要任意設定,非常靈活,而且這樣先設定屬性再建立物件,最終獲取的物件一定是你預期的完整物件,不會像用之前set的方法建立的物件可能還沒有設定完全。

有什麼問題留言或者在我的微信公眾號留言。
另外大家幫忙關注一下我的微信公眾號,每天更新優質java知識。
在這裡插入圖片描述