自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

設(shè)計(jì)模式系列-建造者模式

開發(fā) 前端
建造者模式用于將復(fù)雜對象的創(chuàng)建和表示分離,有些對象由很多部分組成,每個(gè)部分又可以有多種不同選擇,創(chuàng)建這種對象的時(shí)候往往需要考慮使用建造者模式。

  [[431024]]

建造者模式用于將復(fù)雜對象的創(chuàng)建和表示分離,有些對象由很多部分組成,每個(gè)部分又可以有多種不同選擇,創(chuàng)建這種對象的時(shí)候往往需要考慮使用建造者模式。

舉個(gè)例子

一輛汽車由發(fā)動機(jī),方向盤,車燈,車燈,車身顏色等組成,每輛車的顏色,車輪大小,車燈樣式可能會不一樣,但是車的組成部分不會少。

建造模式有兩種實(shí)現(xiàn)方式,第一種方式是有導(dǎo)演的方式,第二種是無導(dǎo)演方式。根據(jù)我的經(jīng)驗(yàn)日常使用無導(dǎo)演的方式可能會更多一些。

有導(dǎo)演

所謂有導(dǎo)演就是通過一個(gè)導(dǎo)演類來指揮對象創(chuàng)建的過程,客戶端使用導(dǎo)演類來獲取對象,不用關(guān)心對象具體的創(chuàng)建過程。

先看一下UML圖,對建造模式有個(gè)大概的了解。

看一下具體代碼,我們以建造一輛汽車舉例

  1. public class Car { 
  2.  
  3.     private String wheel; 
  4.     private String engine; 
  5.     private String seat; 
  6.     private String lamp; 
  7.     private String color; 
  8.  
  9.    //篇幅原因,此處省略get,set方法 
  10.  
  11.     @Override 
  12.     public String toString() { 
  13.         return "Car{" + 
  14.                 "wheel='" + wheel + '\'' + 
  15.                 ", engine='" + engine + '\'' + 
  16.                 ", seat='" + seat + '\'' + 
  17.                 ", lamp='" + lamp + '\'' + 
  18.                 ", color='" + color + '\'' + 
  19.                 '}'
  20.     } 

抽象Builder類,指定建造復(fù)雜對象步驟

  1. public abstract class Builder { 
  2.      
  3.     public abstract void buildWheel(); 
  4.  
  5.     public abstract void buildSeat(); 
  6.  
  7.     public abstract void buildLamp(); 
  8.  
  9.     public abstract void buildColor(); 
  10.  
  11.     public abstract void buildEngine(); 
  12.  
  13.     public abstract Car getCar(); 
  14.  

具體Builder類,實(shí)現(xiàn)復(fù)雜對象具體建造過程和內(nèi)容

  1. public class ConcreteBuilder extends Builder { 
  2.  
  3.     private Car car; 
  4.  
  5.     public ConcreteBuilder() { 
  6.         car = new Car(); 
  7.     } 
  8.  
  9.     @Override 
  10.     public void buildWheel() { 
  11.         car.setWheel("wheel"); 
  12.     } 
  13.  
  14.     @Override 
  15.     public void buildSeat() { 
  16.         car.setSeat("seat"); 
  17.     } 
  18.  
  19.     @Override 
  20.     public void buildLamp() { 
  21.         car.setLamp("lamp"); 
  22.     } 
  23.  
  24.     @Override 
  25.     public void buildColor() { 
  26.         car.setColor("color"); 
  27.     } 
  28.  
  29.     @Override 
  30.     public void buildEngine() { 
  31.         car.setEngine("engine"); 
  32.     } 
  33.  
  34.     //返回構(gòu)建好的汽車模型 
  35.     @Override 
  36.     public Car getCar() { 
  37.         return car; 
  38.     } 

Director類,決定了復(fù)雜對象的創(chuàng)建過程。

  1. public class CarDirector { 
  2.     public Car createCar(Builder builder){ 
  3.         builder.buildWheel(); 
  4.         builder.buildSeat(); 
  5.         builder.buildLamp(); 
  6.         builder.buildColor(); 
  7.         builder.buildEngine(); 
  8.         return builder.getCar(); 
  9.     } 

客戶端這樣使用

  1. public class BuilderClient { 
  2.     public static void main(String[] args){ 
  3.         CarDirector carDirector = new CarDirector(); 
  4.         //通過Director創(chuàng)建具體對象,不關(guān)心對象的創(chuàng)建過程 
  5.         Car car = carDirector.createCar(new ConcreteBuilder()); 
  6.         System.out.println(car.toString()); 
  7.     } 

無導(dǎo)演

無導(dǎo)演模式感覺日常開發(fā)中用的比較多,但凡見到形似這樣的代碼,大概率就是建造者模式了。

  1. Car car = concreteBuilderA.buildEngine("engine"
  2.                     .buildLamp("lamp"
  3.                     .buildSeat("seat"
  4.                     .buildColor("color"
  5.                     //.buildWheel("wheel"
  6.                     .build(); 

老規(guī)矩先來看一下UML圖,來個(gè)整體的認(rèn)識。

同樣來看一下具體代碼實(shí)現(xiàn),還是以創(chuàng)建汽車為例,所以Car的代碼不在重復(fù)給出。

Builder類

  1. public abstract class BuilderA { 
  2.     //返回builder自身 
  3.     abstract BuilderA buildWheel(String wheel); 
  4.     abstract BuilderA buildEngine(String engine); 
  5.     abstract BuilderA buildLamp(String lamp); 
  6.     abstract BuilderA buildSeat(String seat); 
  7.     abstract BuilderA buildColor(String color); 
  8.     abstract Car build(); 

具體Builder,負(fù)責(zé)對象的具體創(chuàng)建工作。

  1. public class ConcreteBuilderA extends BuilderA  { 
  2.  
  3.     private Car car; 
  4.  
  5.     public ConcreteBuilderA() { 
  6.         car = new Car(); 
  7.     } 
  8.  
  9.     @Override 
  10.     BuilderA buildWheel(String wheel) { 
  11.         car.setWheel(wheel); 
  12.         return this; 
  13.     } 
  14.  
  15.     @Override 
  16.     BuilderA buildEngine(String engine) { 
  17.         car.setEngine("engine"); 
  18.         return this; 
  19.     } 
  20.  
  21.     @Override 
  22.     BuilderA buildLamp(String lamp) { 
  23.         car.setLamp("lamp"); 
  24.         return this; 
  25.     } 
  26.  
  27.     @Override 
  28.     BuilderA buildSeat(String seat) { 
  29.         car.setSeat("seat"); 
  30.         return this; 
  31.     } 
  32.  
  33.     @Override 
  34.     BuilderA buildColor(String color) { 
  35.         car.setColor("color"); 
  36.         return this; 
  37.     } 
  38.  
  39.     @Override 
  40.     Car build() { 
  41.         return car; 
  42.     } 

客戶端這樣使用

  1. public class BuilderAClient { 
  2.     public static void main(String[] args){ 
  3.         ConcreteBuilderA concreteBuilderA = new ConcreteBuilderA(); 
  4.  
  5.         Car car = concreteBuilderA.buildEngine("engine"
  6.                     .buildLamp("lamp"
  7.                     .buildSeat("seat"
  8.                     .buildColor("color"
  9.                     //.buildWheel("wheel"
  10.                     .build(); 
  11.         System.out.println(car.toString()); 
  12.     } 

總結(jié)

建造者模式是創(chuàng)建型模式之一,所謂的沒有Director的模式,只不過是把建造過程留給了客戶端,讓使用者自己決定怎樣創(chuàng)建對象。無Director模式的實(shí)現(xiàn)關(guān)鍵是Builder類里面構(gòu)建每個(gè)組件的方法都是返回Builder自己。

責(zé)任編輯:武曉燕 來源: 花括號MC
相關(guān)推薦

2020-10-20 13:33:00

建造者模式

2021-01-21 05:34:14

設(shè)計(jì)模式建造者

2021-04-14 09:02:22

模式 設(shè)計(jì)建造者

2020-11-05 09:38:07

中介者模式

2011-07-14 14:46:46

設(shè)計(jì)模式

2020-10-26 08:45:39

觀察者模式

2024-02-19 08:38:34

建造者模式Android設(shè)計(jì)模式

2013-11-26 17:09:57

Android設(shè)計(jì)模式

2021-07-08 11:28:43

觀察者模式設(shè)計(jì)

2022-01-29 22:12:35

前端模式觀察者

2022-01-12 13:33:25

工廠模式設(shè)計(jì)

2021-05-11 08:54:59

建造者模式設(shè)計(jì)

2020-10-23 09:40:26

設(shè)計(jì)模式

2020-11-03 13:05:18

命令模式

2020-11-04 08:54:54

狀態(tài)模式

2021-06-10 19:09:05

模式代碼建造者

2021-06-09 08:53:34

設(shè)計(jì)模式策略模式工廠模式

2020-10-19 09:28:00

抽象工廠模式

2021-09-29 13:53:17

抽象工廠模式

2022-01-14 09:22:22

設(shè)計(jì)模式橋接
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號