java设计模式-Builder创建者模式
問題分析:
Builder模式是一步一步創建一個復雜對象的創建型模式。該模式是為了將構建復雜對象的過程和他的部件解耦,使得構建過程和部件的表示隔離開來。
Builder模式 主要用于“構建一個復雜的對象”。把復雜對象的創建過程加以抽象,通過子類繼承和重寫方法,來得到具有復合屬性的對象。
同時為了統一創建過程,把對象的創建操作統一封裝到Director的方法中。
由于一個復雜對象的單個屬性可能會發生變化(例如:制造汽車時使用的某一部件屬于不同的廠家)但是整個復雜對象的構建過程卻不會發生變化(例如:汽車的構建圖紙已經固定,只需要把部件按照圖紙裝配好)
GOF:將一個復雜對象的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。即構建過程相同,但是子部件卻不相同。
即:創建者模式只關心構建過程
抽象工廠注重的是不同的工廠生產不同的產品,builder注重的是某個產品由不同的零件組成,產品的生產工程。
Director就是負責產品組裝的,是控制生產過程的;而builder是負責產品部件生產的。這樣就實現了“過程”和“部件”的解耦。
抽象工廠通過不同的構建過程生成不同的對象表示,而Builder模式通過相同的構建過程生成不同的表示。
UML圖:
生活中的例子:計算機的組裝過程簡化為構建主機,設置操作系統,設置顯示器3個部分,然后通過Director類和具體的Builder來構建計算機對象
Computer.java
package com.hust.builder; //計算機抽象類,即Product角色 public abstract class Computer {protected String mBoard;protected String mDisplay;protected String mOs;protected Computer(){};//設置CPU核心數public void setBoard(String board) {mBoard=board;}//設置內存public void setDisplay(String display){mDisplay=display;}//設置操作系統public abstract void setOs();public String toString(){return "Computer[mBoard="+mBoard+",mDisplay="+mDisplay+",mOs="+mOs+"]"; } } MacBook.java
package com.hust.builder; //具體的Computer類,Macbook public class MacBook extends Computer {public void setOs() {mOs="Mac OS X 10.10";}} Builder.java
</pre><pre name="code" class="java">package com.hust.builder; //抽象Builder類 public abstract class Builder {//必須有建造部件的方法public abstract void buildBoard(String board) ;public abstract void buildDisplay(String display) ;public abstract void buildOS();//必須有獲得結果對象的方法public abstract Computer create() ; } MacBookBuilder.java
package com.hust.builder; //具體Builder類,MacbookBuilder public class MacBookBuilder extends Builder {private Computer mComputer=new MacBook();//被構造對象作為具體Builder的成員變量//以下三種方法,是構建對象的部分或者零件public void buildBoard(String board) {mComputer.setBoard(board);}public void buildDisplay(String display) {mComputer.setDisplay(display);}public void buildOS() {mComputer.setOs();}public Computer create() { return mComputer;}} Director.java
package com.hust.builder; //Director類,負責構造Computer public class Director {Builder mBuilder=null;//把構建器作為成員變量public Director(Builder mBuilder){this.mBuilder=mBuilder;}//封裝構建過程public void construct(String board,String display) {mBuilder.buildBoard(board);mBuilder.buildDisplay(display);mBuilder.buildOS();} } 輸出:Computer[mBoard=英特爾主板,mDisplay=AOC顯示器,mOs=Mac OS X 10.10]
注意:
1,builder抽象類必須要有建造部件的方法和獲得結果對象的方法
2,builder具體類必須是對象結果作為成員變量
3,Director的類必須有一個construct方法封裝構造過程
在實際開發中,Director角色經常被省略,直接使用一個Builder來進行對象的主機組裝,這個Builder通常為鏈是調用,它的關鍵點是setter方法都會返回自身,就是return this
MacBookBuilder.java
package com.hust.builder2; //具體Builder類,MacbookBuilder public class MacBookBuilder {private Computer mComputer=new MacBook();//被構造對象作為具體Builder的成員變量//以下三種方法,是構建對象的部分或者零件public MacBookBuilder buildBoard(String board) {mComputer.setBoard(board);return this;}public MacBookBuilder buildDisplay(String display) {mComputer.setDisplay(display);return this;}public MacBookBuilder buildOS() {mComputer.setOs();return this;}public Computer create() { return mComputer;}} test.java
package com.hust.builder2;public class TestBuilder2 {/***計算機的組裝過程簡化為構建主機,設置操作系統,設置顯示器3個部分,然后通過Director類和具體的Builder來構建計算機對象*/public static void main(String[] args) {//構建器,是為了構建對象的零件MacBookBuilder mBuilder=new MacBookBuilder();//在實際開發中,Director角色經常被省略,直接使用一個Builder來進行對象的主機組裝,這個Builder通常為鏈是調用,它的關鍵點事setter方法都會返回自身,他、也就是return this ;System.out.println(mBuilder.buildBoard("因特爾主板").buildDisplay("AOC顯示器").buildOS().create().toString());//System.out.println(mBuilder.create().toString());}}
參考:http://blog.csdn.net/jiafu1115/article/details/6668563
總結
以上是生活随笔為你收集整理的java设计模式-Builder创建者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse和MyEclipse自动提
- 下一篇: Spring IOC的理解总结