設計模式-建立型軟體設計模式(二)
阿新 • • 發佈:2019-01-29
生成器模式
簡介
生成器模式與工廠方法模式二者有相似之處,二者都屬於建立型設計模式,並且都將物件建立的任務交給一個單獨的類去完成。
生成器模式將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。生成器模式按照一個指定的過程逐步建立一個複雜的物件,他允許使用者只通過指定複雜物件的型別和內容就可以構架它們,而不必知道內部的具體構建細節。生成器的主要思想是抽象出構建物件的步驟,使得這些步驟的不同實現可以建立物件的不同表示。通常,生成器模式被用來建立符合組合模式的產品物件。
特點
(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();
總結
工廠模式可以看做是生成者模式的一個簡化版本。工廠方法模式中,工廠方法負責建立一個類的不同子類物件,使用者不需要知道哪個子類被建立了。在生成者模式中,生成器也使用了一個建立者方法建立不同的子類的物件,但是即使使用的是同樣的子類,這些子類的物件的組合也可能不同。
通常,在初始設計的時候可以使用工廠模式,而當設計中發現需要更多的靈活性的時候,設計者可以開始考慮使用抽象工廠模式或者生成者模式。