1. 程式人生 > >設計模式-建立型軟體設計模式(二)

設計模式-建立型軟體設計模式(二)

生成器模式

簡介

生成器模式與工廠方法模式二者有相似之處,二者都屬於建立型設計模式,並且都將物件建立的任務交給一個單獨的類去完成。
生成器模式將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。生成器模式按照一個指定的過程逐步建立一個複雜的物件,他允許使用者只通過指定複雜物件的型別和內容就可以構架它們,而不必知道內部的具體構建細節。生成器的主要思想是抽象出構建物件的步驟,使得這些步驟的不同實現可以建立物件的不同表示。通常,生成器模式被用來建立符合組合模式的產品物件。

特點

(1)生成器讓使用者可以變化它建造產品的內部表示方式,它也隱藏了產品怎樣裝配的細節。
(2)每個具體的生成器都獨立於程式的其他生成器,因此改善了程式的模組化,而且使新增其他生成器變得相對簡單。
(3)由於每個生成器根據資料逐步的構架最終產品,使用者對生成器構建的最終產品有更多的控制。
(4)生成器模式與抽象工廠模式有相似之處,都返回由其他一些物件組成的類的物件。主要區別是:抽象工廠模式返回一個類族,而生成器模式逐步按照次序構建一個負載的物件,最後該物件被返回。

示例

具體的產品類
class House
{
    private String type = null; 
    private String area;
    private String bedroom;
    private String bathroom;
    private String garage;
    int house_low_price = 5000;
    int house_middle_price = 10000;
    int house_high_price = 20000;
    ....
    public int getHousePrice(){...}
}

生成器
abstract class HouseBuilder
{
    protected House house;
    protected String area;
    protected String bedroom;
    protected String bathroom;
    protected String garage;

    public void createNewHouse(){house = new House();}
    ....
    public abstract buildArea();
    public abstract buildBedroom();
    public abstract buildBathroom();
    public abstract buildGarage();
}

class lowHouseBuilder extends HouseBuilder
{
    public void buildArea(house.setArea(area));
    public void buildBedroom(){...};
    public void buildBathroom(){..};
    public void buildGarage(){...};
}

class middleHouseBuilder extends HouseBuilder
{
    public void buildArea(house.setArea(area));
    public void buildBedroom(){...};
    public void buildBathroom(){..};
    public void buildGarage(){...};
}

class highHouseBuilder extends HouseBuilder
{
    public void buildArea(...);
    public void buildBedroom(){...};
    public void buildBathroom(){..};
    public void buildGarage(){...};
}

director類,負責指導builder
public class Director
{
    private HouseBuilder hs;
    public void constructHouse()
    {
        hs.createNewHouse();
        hs.buildArea(...);
        hs.buildBedroom(){...};
        hs.buildBathroom(){..};
        hs.buildGarage(){...};
    }
    public void SetBuilder(HouseBuilder value){hs = value;}
    HouseBuilder GetBuilder(){...}
    House getHouse(){...}
}
---------以上是生成者模式--------
工廠類
class BuildFactory
{
    public HouseBuilder getBuilder(String str)
    {
        HouseBuilder builder = null;
        if(str.equals(...)){builder = new lowHouseBuilder ();}
        ...
    }
}

使用:
Director dir = new Director();
dir.setBuilder(builder);
dir.constructHouse();
dir.getHouse();

總結

工廠模式可以看做是生成者模式的一個簡化版本。工廠方法模式中,工廠方法負責建立一個類的不同子類物件,使用者不需要知道哪個子類被建立了。在生成者模式中,生成器也使用了一個建立者方法建立不同的子類的物件,但是即使使用的是同樣的子類,這些子類的物件的組合也可能不同。
通常,在初始設計的時候可以使用工廠模式,而當設計中發現需要更多的靈活性的時候,設計者可以開始考慮使用抽象工廠模式或者生成者模式。