1. 程式人生 > >android設計模式:Builder模式

android設計模式:Builder模式

Builder模式(建造者模式):將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
我們看看一種物件生成的方式,以寵物醫院記錄寵物狗資訊為例:

這裡寫圖片描述

//汪汪資訊類
public class Dog{   
    private int identifier;//編號
    private String name;//名字
    private int age;//年齡
    private int weight;//體重
    private String breed;//品種
    private boolean gender;//性別,true:公狗;false:母狗
    private
String sickness;//疾病 public void setIdentifier(int identifier){ this.identifier=identifier; } public void setName(String name){ this.name=name; } public void setAge(int age){ this.age=age; } public void setWeight(int weight){ this
.weight=weight; } public void setBreed(int breed){ this.breed=breed; } public void setGender(boolean gender){ this.gender=gender; } public void setSickness(String sickness){ this.sickness=sickness; } } //一隻新的汪進來了 Dog dog=new Dog; dog.setIdentifier(2222
);//因為是一隻二哈,2炸了 dog.setName("sijia");//撕家小能手呀 dog.setAge(3); dog.setWeight(20); dog.setBreed("Husky"); dog.setGender(true); dog.setSickness("doubi");//這隻哈士奇太逗逼了,還能治嗎?

終於把它的資訊記錄完了,有沒發現類名dog都重複了好多遍,那有沒有簡潔點的方式,有的。在Dog類中增加新的方法:

public void setDogInfo(int identifier,int String name,int age,int weight,String breed,boolean gender,String sickness){
    this.identifier=identifier;
    this.name=name;
    this.age=age;
    this.weight=weight;
    this.breed=breed;
    this.gender=gender;
    this.sickness=sickness;
}

//感覺完美呀,呼叫看看
Dog dog=new Dog();
dog.setDogInfo(2222,"sijia",3,20,"Husky",true,"doubi");

一行搞定,不過數字和字串的含義不是一目瞭然,還是得檢視定義。新增引數就得修改定義,呼叫的地方也得修改
而且如果引數更多的話,看起來會更亂

這裡寫圖片描述

建造者模式就為提供了另外一種解決方式,引入構造器Builder,讓它實現構造的任務。

//汪汪資訊類
public class Dog{   
    private int identifier;//編號
    private String name;//名字
    private int age;//年齡
    private int weight;//體重
    private String breed;//品種
    private boolean gender;//性別,true:公狗;false:母狗
    private String sickness;//疾病

    static class Builder{
        private Dog dog;

        public Builder(){
            dog=new Dog();
        }
        public Builder setIdentifier(int identifier){
             dog.identifier=identifier;
             return this;
    }

         public Builder setName(String name){
             dog.name=name;
             return this;
        }

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

         public Builder setWeight(int weight){
             dog.weight=weight;
             return this;
        }

         public Builder setBreed(int breed){
             dog.breed=breed;
             return this;
        }

         public Builder setGender(boolean gender){
             dog.gender=gender;
             return this;
        }
        public Builder setSickness(String sickness){
             dog.sickness=sickness;
             return this;
        }

        public Dog create(){
            return dog;
        }
    }
}

在物件內部增加了Builder,Buidler設定引數的方法返回都是Builder這個物件
現在呼叫一下:

Dog dog=new Dog.Builder().setIdentifier(2222).setName("sijia").setAge(3)
.setWeight(20).setBreed("Husky").setGender(true).setSickness("doubi")
.create();

這樣,每項引數定義清晰,而且直接頭尾相連定義,省去重複的程式碼。
感覺上是我們先獲取Builder,然後構建所有引數,最後再將構建出的物件顯露出來。
契合了模式定義:將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

這裡寫圖片描述