Java學習筆記---設計模式之建造者模式(一),學習筆記設計模式
一、引言
每天進步一點點,每天快樂一點點。堅持每天寫點東西,感覺很好,既複習基礎知識,又可以收穫一份成就感,何樂而不為呢?設計模式是一個菜鳥成為一個高手必須要掌握的東西,因此我們今天的話題就是設計模式之建造者模式。
二、什麼是建造者模式
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
三、建造者模式類圖
類圖是一個很重要的理解設計模式的工具,因此必須很好的理解。
四、建造者模式中的角色
1、Builder:給出一個抽象介面,規範建造者對於生產的產品的各個組成部分的建造。這個介面只是定一個規範,不涉及具體的建造,具體的建造讓繼承於它的子類(ConcreteBuilder)去實現。
2、ConcreteBuilder:實現builder介面,針對不同的商業邏輯,具體化各對象部分的建造,最後返回一個建造好的產品。
3、Director:導演,顧名思義,負責規範流程之用。在指導中不涉及產品的建立,只負責保證複雜物件各部分被建立或按某種順序建立。
4、Product:複雜物件。也是被建造的對象
五、舉例說明
工程結構圖:
AbstractCar.java
package designModeBulder;//抽象產品類public abstract class AbstractCar {abstract public void seat();//建造座位abstract public void light();//建造燈光abstract public void wheel();//建造輪子abstract public void engine();//建造發動機//預設流程public void defaultCar(){seat();light();wheel();engine();}}
BenchiCar.java
package designModeBulder;public class BenChiCar extends AbstractCar{@Overridepublic void seat() {// TODO Auto-generated method stubSystem.out.println("平治車建造了座椅");}@Overridepublic void light() {// TODO Auto-generated method stubSystem.out.println("平治車建造了燈光");}@Overridepublic void wheel() {// TODO Auto-generated method stubSystem.out.println("平治車建造了輪子");}@Overridepublic void engine() {// TODO Auto-generated method stubSystem.out.println("平治車建造了發動機");}}
BmwCar.java
package designModeBulder;public class BmwCar extends AbstractCar {@Overridepublic void seat() {// TODO Auto-generated method stubSystem.out.println("寶馬建造了座位");}@Overridepublic void light() {// TODO Auto-generated method stubSystem.out.println("寶馬建造了燈光");}@Overridepublic void wheel() {// TODO Auto-generated method stubSystem.out.println("寶馬建造了輪子");}@Overridepublic void engine() {// TODO Auto-generated method stubSystem.out.println("寶馬建造了發動機");}}
ICarBuilder.java
package designModeBulder;//抽象建造者public interface ICarBuilder {public void buildCar();public AbstractCar getCar();}
BenchiCarBuilder.java
package designModeBulder;public class BenChiCarBuilder implements ICarBuilder {BenChiCar benChiCar=new BenChiCar();//先建立一輛空白的平治車@Overridepublic void buildCar() {// TODO Auto-generated method stubbenChiCar.wheel();//先建造輪子benChiCar.engine();//再造發動機benChiCar.light();//造燈光benChiCar.seat();//建造座位}@Overridepublic AbstractCar getCar() {// TODO Auto-generated method stubreturn this.benChiCar;//建好了一輛平治}}
BmwCarBuilder.java
package designModeBulder;public class BmwCarBuilder implements ICarBuilder{BmwCar bmwCar = new BmwCar();@Overridepublic void buildCar() {// TODO Auto-generated method stubbmwCar.wheel();bmwCar.engine();bmwCar.seat();bmwCar.light();}@Overridepublic AbstractCar getCar() {// TODO Auto-generated method stubreturn this.bmwCar;}}
CarDirector.java
package designModeBulder;//導演類角色public class CarDerictor {BenChiCarBuilder benChiCarBuilder = new BenChiCarBuilder();//擁有建造平治車的師傅BmwCarBuilder bmwCarBuilder= new BmwCarBuilder();//擁有建造寶馬車的師傅public AbstractCar getbenCar() {benChiCarBuilder.buildCar();return benChiCarBuilder.getCar();}public AbstractCar getBmaCar(){bmwCarBuilder.buildCar();return bmwCarBuilder.getCar();}}
BuilderTest.java
package designModeBulder;public class BuidlerTest {public static void main(String args[]){CarDerictor carDerictor = new CarDerictor();BenChiCar benChiCar =(BenChiCar)carDerictor.getbenCar();BmwCar bmwCar = (BmwCar)carDerictor.getBmaCar();}}
運行結果:
平治車建造了輪子
平治車建造了發動機
平治車建造了燈光
平治車建造了座椅
寶馬建造了輪子
寶馬建造了發動機
寶馬建造了座位
寶馬建造了燈光
六、總結
使用建造者模式可以使用戶端不必知道產品內部組成的細節,如例子中我們就不需要關心每一個具體的模型內部是如何?的,產生的物件類型就是AbstractCar.建造者之間是相互獨立的,易於擴充。其適用情境:相同的方法,不同的執行順序,產生不同的事件結果時,可以採用建造者模式;多個組件或零件,都可以裝配到一個對象中,但是產生的運行結果又不相同時,則可以使用該模式;產品類非常複雜,或者產品類中的調用順序不同產生了不同的效能,這個時候使用建造者模式是非常合適。 在對象建立過程中會使用到系統中的一些其它對象,這些對象在產品對象的建立過程中不易得到時,也可以採用建造者模式封裝該對象的建立過程。該種情境,只能是一個補償方法,因為一個對象不容易獲得,而在設計階段竟然沒有發覺,而要通過建立者模式柔化建立過程,本身已經違反設計最初目標。
一篇很不錯的文章可以參考這裡。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。討論QQ群:372702757