設計模式之—建造者模式(Builder)-Java實現

來源:互聯網
上載者:User

Builder模式,將產品的內部表象和產品的產生過程分割開來,從而使一個建造過程產生具有不同的內部

表象的產品對象。建造模式使得產品內部表象可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。

將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

相關模式:思路和模板方法模式很像,模板方法是封裝演算法流程,對某些細節,提供介面由子類修改,建造者模式更為高層一點,將所有細節都交由子類實現。

建造者模式的使用方式:

以下情況應當使用建造者模式:

1、需要產生的產品對象有複雜的內部結構。

2、需要產生的產品對象的屬性相互依賴,建造者模式可以強迫產生順序。

3、 在對象建立過程中會使用到系統中的一些其它對象,這些對象在產品對象的建立過程中不易得到。

優缺點:

優點:1、建造者模式的使用使得產品內部表象可以獨立的變化,使用戶端不必知道產品內部組成細節。

 2、每一個Builder都相對獨立,而與其它的Builder無關。

 3、可以使對構造過程更加精細控制,以降低控制細節的風險。

4、將構建代碼和表示代碼分開。

缺點:1、由於其的變化點在於對象建立的細節,故其也難於分步驟構建的演算法需求的變動,因為其關注的是對象建立順序。

建造者模式一般適用於穩定的系統,比如說同樣是對人的描述,如果描述的是正常人,就可用,但是對於殘疾人,因為系統不再穩定,再使用的話就無法滿足“開閉原則”了。

當要生產的一種產品具有相同的結構,並且每個構件的生產都很繁雜,就可以用Builder模式將具體構件的生產與整個成品的組裝分離開來。還是拿本文的代碼來舉例,生產一台筆記本,筆記本的廠家不需要知道CPU怎麼生產的,不需要關心記憶體怎麼生產的,也不需要關心主板怎麼生產的等。當他在生產一台筆記本的時候,只會說,我要一塊Intel的CPU,於是就有了CPU(至於Intel的CPU怎麼生產的他不關心,他只要一個CPu),他又說我要一塊金士頓記憶體,於是就有了金士頓記憶體,這樣直到他得到了所有的構件,然後他把這些構件組裝起來,組成一台筆記本賣給客戶。這就是一個典型的Builder模式。下面是代碼:


/** * CPU抽象類別 */public abstract class CPU {public abstract CPU getCPU();}

/** * Intel的cpu */public class IntelCPU extends CPU {public IntelCPU(){};@Overridepublic CPU getCPU() {// TODO Auto-generated method stubreturn new IntelCPU();} public String toString(){          return " IntelCPU ";      }  }

/** * AMD的cpu  */public class AMDCPU extends CPU {public AMDCPU(){};@Overridepublic CPU getCPU() {// TODO Auto-generated method stubreturn new AMDCPU();} public String toString(){          return " AMDCPU ";      }  }

/** * 記憶體抽象類別 */public abstract class Memory {public abstract Memory getMemory();}

/** * 金士頓記憶體 */public class KingstonMemory extends Memory {public KingstonMemory(){};@Overridepublic Memory getMemory() {return new KingstonMemory();} public String toString(){          return " KingstonMemory ";      }  }

/** * 宇瞻記憶體 */public class ApacerMemory extends Memory {public ApacerMemory(){};@Overridepublic Memory getMemory() {// TODO Auto-generated method stubreturn new ApacerMemory();}public String toString(){          return " ApacerMemory ";      }  }

** * 主板抽象類別 */public abstract class Mainboard {public abstract Mainboard getMainboard();}

/** * 華碩主板 */public class AsusMainboard extends Mainboard {public AsusMainboard(){};@Overridepublic Mainboard getMainboard() {// TODO Auto-generated method stubreturn new AsusMainboard();}public String toString(){          return " AsusMainboard ";      }  }

/** * 技嘉主板 */public class GaMainboard extends Mainboard {public GaMainboard(){}@Overridepublic Mainboard getMainboard() {return new GaMainboard();}; public String toString(){          return " GaMainboard ";      }  }

/** * 電腦所需組件 */public class Computer {private CPU cpu;private Memory memory;private Mainboard mainboard;public CPU getCpu() {return cpu;}public void setCpu(CPU cpu) {this.cpu = cpu;}public Memory getMemory() {return memory;}public void setMemory(Memory memory) {this.memory = memory;}public Mainboard getMainboard() {return mainboard;}public void setMainboard(Mainboard mainboard) {this.mainboard = mainboard;}}

/** * 電腦Builder */public interface ComputerBuilder {public void buildCPU();      public void buildMemory();      public void buildMainboard();      public Computer getComputer(); }

/** * 聯想電腦Builder */public class LenoveComputerBuilder implements ComputerBuilder { private Computer lenoveComputer=null;      public LenoveComputerBuilder(){      lenoveComputer=new Computer();      }  @Overridepublic void buildCPU() {lenoveComputer.setCpu(new IntelCPU());}@Overridepublic void buildMemory() {lenoveComputer.setMemory(new KingstonMemory());}@Overridepublic void buildMainboard() {lenoveComputer.setMainboard(new AsusMainboard());}@Overridepublic Computer getComputer() {buildCPU();      buildMemory();      buildMainboard();  return lenoveComputer;}}

/** * 惠普電腦Builder */public class HPComputerBuilder implements ComputerBuilder { private Computer HPComputer=null;  public HPComputerBuilder(){HPComputer = new Computer();}@Overridepublic void buildCPU() {HPComputer.setCpu(new AMDCPU());}@Overridepublic void buildMemory() {HPComputer.setMemory(new ApacerMemory());}@Overridepublic void buildMainboard() {HPComputer.setMainboard(new GaMainboard());}@Overridepublic Computer getComputer() {buildCPU();      buildMemory();      buildMainboard();  return HPComputer;}}

public class Director { private ComputerBuilder builder;       public Director(ComputerBuilder builder) {           this.builder = builder;       }      public Computer construct() {           return builder.getComputer();      }   }

public class TestBuilder {/** * @param args */public static void main(String[] args) {Computer lenoveComputer,hpComputer;  ComputerBuilder lenoveComputerBuilder = new LenoveComputerBuilder();  ComputerBuilder hpComputerBuilder = new HPComputerBuilder();          Director director;          director = new Director(lenoveComputerBuilder);          lenoveComputer=director.construct();          director = new Director(hpComputerBuilder);          hpComputer=director.construct();          System.out.println("lenoveComputer is made by:"+lenoveComputer.getCpu()+lenoveComputer.getMemory()+lenoveComputer.getMainboard());          System.out.println("hpComputer is made by:"+hpComputer.getCpu()+hpComputer.getMemory()+hpComputer.getMainboard());  }}

運行結果:

lenoveComputer is made by: IntelCPU  KingstonMemory  AsusMainboard 
hpComputer is made by: AMDCPU  ApacerMemory  GaMainboard 

註解:

在main函數裡面,director調用了builder裡面的getComputer()方法,getComputer()方法實際就是組裝的過程,getComputer()裡面的buildCPU();
  buildMemory();   buildMainboard();  就是在購買構件,而這些構件生產的具體過程放在了這些構件自身的類裡面,可以看到buildCPU()裡面有new一個對象,這就是在進行生產。這樣就達到了組裝和生產構件之間的分離。

最後,說說Builder模式和Factory模式之間區別的理解。Builder和Factory之間的區別就是組裝和生產之間的區別,Builder著重將組裝和構件的生產分離,Factory著重於最佳化生產的過程。本文的代碼實際上還可以進行重構,例如,在buildCPU()函數裡面,用到了new這個關鍵字,實際上可以將這個new換成工廠類,讓工廠類來生產CPU。換一種說法,就是Factory不進行組裝,Builder進行組裝,當Factory進行組裝的時候,它就變成Builder了。

下期預告,Prototype模式!


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.