設計模式(2): 生成器模式

  生成器模式(英:Builder Pattern)是一種設計模式,又名:建造模式,是一種對象構建模式。它可以將複雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不同實現方法可以構造出不同表現(屬性)的對象。
  前面一篇文章提到的抽象工廠模式與生成器相似,因爲它也可以創建複雜對象。主要的區別是生成器模式着重於一步步構造一個複雜對象。而抽象工廠模式着重於多個系列的產品對象(簡單的或是複雜的)。生成器在最後的一步返回產品,而對於抽象工廠來說,產品是立即返回的。

  意圖:將一個複雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。
  主要解決:主要解決在軟件系統中,有時候面臨着”一個複雜對象”的創建工作,其通常由各個部分的子對象用一定的算法構成;由於需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是將它們組合在一起的算法卻相對穩定。
  何時使用:一些基本部件不會變,而其組合經常變化的時候。
  如何解決:將變與不變分離開。
  應用實例: 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的”套餐”。
  

在這樣的設計模式中,有以下幾個角色:
  Builder:爲創建一個產品對象的各個部件指定抽象接口。
  ConcreteBuilder:實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並提供一個檢索產品的接口。
  Director:構造一個使用Builder接口的對象。
  Product:表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。

//Builder
    public interface PersonBuilder {
        void buildHead();
        void buildBody();
        void buildFoot();
        Person buildPerson();
}
//ConcreteBuilder
    public class ManBuilder implements PersonBuilder {
        Person person;
        public ManBuilder() {
            person = new Man();
        }
        public void buildbody() {
            person.setBody("建造男人的身體");
        }
        public void buildFoot() {
            person.setFoot("建造男人的腳");
        }
        public void buildHead() {
            person.setHead("建造男人的頭");
        }
        public Person buildPerson() {
            return person;
        }
}
//Director
    public class PersonDirector {
        public Person constructPerson(PersonBuilder pb) {
            pb.buildHead();
            pb.buildBody();
            pb.buildFoot();
            return pb.buildPerson();
        }
}
//Product
    public class Person {
        private String head;
        private String body;
        private String foot;
        public String getHead() {
            return head;
        }
        public void setHead(String head) {
            this.head = head;
        }
        public String getBody() {
            return body;
        }
        public void setBody(String body) {
            this.body = body;
        }
        public String getFoot() {
            return foot;
        }
        public void setFoot(String foot) {
            this.foot = foot;
        }
}
public class Man extends Person {
}
//Test
    public class Test{
        public static void main(String[] args) {
            PersonDirector pd = new PersonDirector();
            Person person = pd.constructPerson(new ManBuilder());
            System.out.println(person.getBody());
            System.out.println(person.getFoot());
            System.out.println(person.getHead());
        }
}

  如果系統中只需要一個具體的建造者的話,可以省略掉抽象建造者。在具體建造者只有一個的情況下,如果抽象建造者角色已經被省略掉,那麼還可以省略掉指導者角色,讓Builder自己扮演指導者和建造者雙重角色。
  還是那句話,不要去套模式章法,怎麼簡潔舒服怎麼用。

參考:
https://zh.wikipedia.org/wiki/%E7%94%9F%E6%88%90%E5%99%A8%E6%A8%A1%E5%BC%8F
http://baike.baidu.com/view/7995255.htm
http://www.runoob.com/design-pattern/builder-pattern.html

發佈了89 篇原創文章 · 獲贊 9 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章