1. 程式人生 > >java設計模式--建造模式

java設計模式--建造模式

引導 res string 分離 void this 類型 人類 alien

建造模式

建造模式屬於對象創建型模式,建造模式的目的為將復雜對象的構建過程與其部件實現方式分離,使得同樣的構建過程可以有不同的表示,同時相同的構建過程也能夠適用於不同的部件實現方式。

建造模式的適用性

建造模式主要適用於以下情況:

  • 當需要復雜對象的創建方法應該獨立於該對象的組成部分的構造方法時。
  • 當構造算法必須能夠接受被構造的對象使用相同的構造算法有不同的對象表示時。

建造模式的具體實現結構

技術分享圖片

在上述結構圖中,我們可以看到建造模式總共有4個角色:

1、Builder(抽象建造者)角色:抽象建造者為創建Product對象的各個組成部分提供接口。

2、ConcreteBuilder(具體建造者)角色:具體建造者角色通過實現抽象建造者的每個BuildPart方法,並且在對象建造完成後返回結果實例。每一個具體建造者都負責一類產品對象的各個組成部分的建造方法,每一個具體建造者的方法只需要寫一次,多個不同的Director(導向器)角色都可以調用生成同一類型下不同的產品。

3、Director(導向器)角色:通過復雜的算法調用具體建造者的方法建造出相應的產品對象。需要說的是同一個導向器實例可以調用不同具體建造者實例的方法構建出不同的產品對象,其中不同具體建造者的方法不能組合使用來構建對象

4、Procdute(產品)角色:建造模式產生的復雜對象就是產品角色。一個建造模式中可能會有很多個不同類型的產品,每個產品實現的接口都不相同,所以產品角色沒有必要抽象出通用的接口。

建造模式的應用

  我們平時畫一個人要畫他的頭、手、身體、腳,這些是一個人的組成部分,固定需要畫的。我們可以抽象出一個畫頭、手、身體、腳的接口出來,具體怎麽畫人可以再通過抽象出來的接口來定。比如說:普通一點的就是一個頭、一個身體、兩只手、兩只腳,但是也可以畫出一個人有三頭六臂得人等等。下面我們定義一個抽象方法給出實現一個人身上的各個部件:

public abstract class PersonBuilder {
    
public abstract void buileHead(); public abstract void buildLeftHand(); public abstract void buildRightHand(); public abstract void buledBody(); public abstract void buileLeftLeg(); public abstract void buileRightLeg(); public abstract Person getResult(); }

下面定義一個構造人類的類繼承抽象類PersonBuilder,分別實現頭、身體、手、大腿這些部件的構建。

public class HumanBuilder extends PersonBuilder {

    Person person =new Person();
    @Override
    public void buileHead() {
        System.out.println("畫一個人類的頭");
        person.setHead("人類的頭");
    }

    @Override
    public void buildLeftHand() {
        System.out.println("畫一個人類的左手");
        person.setLeftHand("人類的左手");
    }

    @Override
    public void buildRightHand() {
        System.out.println("畫一個人類的右手");
        person.setRightHand("人類的右手");
    }

    @Override
    public void buledBody() {
        System.out.println("畫一個人類的身體");
        person.setBody("人類的身體");
    }

    @Override
    public void buileLeftLeg() {
        System.out.println("畫一個人類的左腿");
        person.setLeftLeg("人類的左腿");
    }

    @Override
    public void buileRightLeg() {
        System.out.println("畫一個人類的右腿");
        person.setRightLeg("人類的右腿");
    }
    @Override
    public Person getResult(){
        return person;
    }
}

產品類Person

public class Person {

    private String Head;
    private String LeftHand;
    private String RightHand;
    private String Body;
    private String LeftLeg;
    private String RightLeg;

    public String getHead() {
        return Head;
    }

    public void setHead(String head) {
        Head = head;
    }

    public String getLeftHand() {
        return LeftHand;
    }

    public void setLeftHand(String leftHand) {
        LeftHand = leftHand;
    }

    public String getRightHand() {
        return RightHand;
    }

    public void setRightHand(String rightHand) {
        RightHand = rightHand;
    }

    public String getBody() {
        return Body;
    }

    public void setBody(String body) {
        Body = body;
    }

    public String getLeftLeg() {
        return LeftLeg;
    }

    public void setLeftLeg(String leftLeg) {
        LeftLeg = leftLeg;
    }

    public String getRightLeg() {
        return RightLeg;
    }

    public void setRightLeg(String rightLeg) {
        RightLeg = rightLeg;
    }
}

  最後通過一個PersonDirector引導器來完成一個人的組裝構建,通過調用HumanBuilder的方法通過不同的算法可以組建一個有一個頭、兩個手、一個身體、兩只腳的正常人,也可以構建出一個擁有三頭六臂的神人,還可以構建出一位只有一只手的殘疾人,這就是我們所說的通過不同的構建方法調用同一個建造器可以得到不同的表示。同樣的道理還可以再定義一個外星人的AlienBuilder建造器,通過組裝個頭、兩個手、一個身體、兩只腳的人類的組裝方法得到與人類完全不同的外星人對象。

  所以說不同的構造方法可以得到復雜對象的不同表示,相同的構造方法也可以創造出不同的對象的表示。

  下面給出一種組裝一個頭、兩個手、一個身體、兩只腳的正常人的構造方法。

public class PersonDirector {
    private PersonBuilder personBuilder;

    public PersonDirector(PersonBuilder personBuilder) {
        this.personBuilder = personBuilder;
    }

    public void CreatePerson() {
        personBuilder.buileHead();
        personBuilder.buildLeftHand();
        personBuilder.buildRightHand();
        personBuilder.buledBody();
        personBuilder.buileLeftLeg();
        personBuilder.buileRightLeg();
    }
}

Clien調用

public class Client {
    public static void main(String[] args) {
        PersonBuilder personBuilder = new HumanBuilder();
        PersonDirector personDirector = new PersonDirector(personBuilder);
        personDirector.CreatePerson();
        Person person = personBuilder.getResult()
    }
}
畫一個人類的頭
畫一個人類的左手
畫一個人類的右手
畫一個人類的身體
畫一個人類的左腿
畫一個人類的右腿

總結

  建造模式可以很輕易的就改變一個產品的內部表示,通過定義一個新的生成器在客戶端就可以調用不同的生成器產生不同的對象表示;同時建造模式也將產品的構建過程和表示分離開,使得客戶不用知道一個產品的內部構造是什麽樣的,只需要調用生成器的接口就可以建造出一個需要的對象;最後建造模式可以使得使用者能夠對產品的構建過程進行更加精確的控制,通過導向器一一步一步的建造出一個復雜的對象。

  建造模式和抽象工廠模式的區別在於建造模式更加註重的是一步一步構建產品的過程,而抽象工廠模式更加註重一系列相關聯的產品部件組建出一個產品。建造模式是一步一步的構建產品,而抽象工廠模式是立即就生成對象。

java設計模式--建造模式