成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

設計模式系列之建造者模式

開發 前端
建造者模式是一種創建型設計模式, 使你能夠分步驟創建復雜對象。該模式允許你使用相同的創建代碼生成不同類型和形式的對象。

[[377314]]

本文轉載自微信公眾號「狼王編程」,作者狼王 。轉載本文請聯系狼王編程公眾號。  

 1、概述

建造者模式是一種創建型設計模式, 使你能夠分步驟創建復雜對象。該模式允許你使用相同的創建代碼生成不同類型和形式的對象。

2、適用場景

1)避免重疊構造函數,例如:一個類有很多的屬性,這時候的構造方法需要傳遞很多的參數,為了避免這樣,會重新寫一個相對參數較少的構造方法,但是仍然需要對其他參數進行賦默認值。

2)當需要創建不同的產品類型,此處指比較接近的產品類型,則可以在頂層builder中包含大部分產品屬性的賦值方法。

3、實例

有以下場景,我們分別使用常規方式和建造者模式實現:

  1. 當前有一個汽車工廠,可以生產的汽車類型有ordinary,sport。 
  2. 除了汽車之外,同樣可以生產汽車的操作手冊manual。 
  3. 汽車有以下的屬性: 
  4. 1、type 類型 
  5. 2、seats 座位數 
  6. 3、engine 引擎 
  7. 4、GPS 導航 
  8.  
  9. 分別實現汽車和手冊的生產過程 

不使用建造者模式

分別創建車car和手冊manual,以及其內部的屬性,當前例子中車和手冊是相同的屬性。

  1. @Data 
  2. public class Car { 
  3.  
  4.     private CarType type; 
  5.  
  6.     private int seats; 
  7.  
  8.     private Engine engine; 
  9.  
  10.     private GPS GPS; 
  11.  
  12.     public Car(CarType type, int seats, Engine engine, com.cloud.bssp.designpatterns.builder.withouttdesign.entity.GPS GPS) { 
  13.         this.type = type; 
  14.         this.seats = seats; 
  15.         this.engine = engine; 
  16.         this.GPS = GPS; 
  17.     } 
  18.  
  19.     public void detail() { 
  20.         System.out.println("this is " + type + " car"); 
  21.         System.out.println("the seats is :" + seats); 
  22.         System.out.println("the engine is :" + engine); 
  23.         System.out.println("this GPS is :" + GPS); 
  24.     } 
  1. @Data 
  2. public class Manual { 
  3.  
  4.     private CarType type; 
  5.  
  6.     private int seats; 
  7.  
  8.     private Engine engine; 
  9.  
  10.     private GPS GPS; 
  11.  
  12.     public Manual(CarType type, int seats, Engine engine, com.cloud.bssp.designpatterns.builder.withouttdesign.entity.GPS GPS) { 
  13.         this.type = type; 
  14.         this.seats = seats; 
  15.         this.engine = engine; 
  16.         this.GPS = GPS; 
  17.     } 
  18.  
  19.     public void detail() { 
  20.         System.out.println("this is " + type + " car"); 
  21.         System.out.println("the seats is :" + seats); 
  22.         System.out.println("the engine is :" + engine); 
  23.         System.out.println("this GPS is :" + GPS); 
  24.     } 
  1. public enum CarType { 
  2.     SPORT,ORDINARY; 
  1. /** 
  2.  * 汽車引擎 
  3.  */ 
  4. @Data 
  5. public class Engine { 
  6.  
  7.     /** 
  8.      * 排量 
  9.      */ 
  10.     private final double volume; 
  11.     /** 
  12.      * 里程 
  13.      */ 
  14.     private double mileage; 
  15.  
  16.     public Engine(double volume, double mileage) { 
  17.         this.volume = volume; 
  18.         this.mileage = mileage; 
  19.     } 
  1. @Data 
  2. public class GPS { 
  3.     /** 
  4.      * 路線 
  5.      */ 
  6.     private String route; 
  7.  
  8.     public GPS(String route) { 
  9.         this.route = route; 
  10.     } 

測試類:

 

  1. /** 
  2.  * 客戶端 
  3.  */ 
  4. @RunWith(SpringRunner.class) 
  5. @SpringBootTest(classes = TestApplication.class) 
  6. public class TestDemo { 
  7.  
  8.     @Test 
  9.     public void test() { 
  10.         //生產跑車 
  11.         Car sportCar = new Car( 
  12.                 CarType.SPORT, 
  13.                 2, 
  14.                 new Engine(3.0, 0), 
  15.                 new GPS("上海東方明珠塔到上海動物園"
  16.         ); 
  17.         sportCar.detail(); 
  18.         System.out.println("----------------------------------------"); 
  19.         //生產普通汽車 
  20.         Car ordinaryCar = new Car( 
  21.                 CarType.ORDINARY, 
  22.                 4, 
  23.                 new Engine(2.0, 0), 
  24.                 new GPS("上海東方明珠塔到上海動物園"
  25.         ); 
  26.         ordinaryCar.detail(); 
  27.         System.out.println("----------------------------------------"); 
  28.         //生產汽車操作手冊 
  29.         Manual manual = new Manual( 
  30.                 CarType.ORDINARY, 
  31.                 4, 
  32.                 new Engine(2.0, 0), 
  33.                 new GPS("上海東方明珠塔到上海動物園"
  34.         ); 
  35.         manual.detail(); 
  36.         System.out.println("----------------------------------------"); 
  37.     } 

結果:

  1. this is SPORT car 
  2. the seats is :2 
  3. the engine is :Engine(volume=3.0, mileage=0.0) 
  4. this GPS is :GPS(route=上海東方明珠塔到上海動物園) 
  5. ---------------------------------------- 
  6. this is ORDINARY car 
  7. the seats is :4 
  8. the engine is :Engine(volume=2.0, mileage=0.0) 
  9. this GPS is :GPS(route=上海東方明珠塔到上海動物園) 
  10. ---------------------------------------- 
  11. this is ORDINARY car 
  12. the seats is :4 
  13. the engine is :Engine(volume=2.0, mileage=0.0) 
  14. this GPS is :GPS(route=上海東方明珠塔到上海動物園) 
  15. ---------------------------------------- 

使用建造者模式實現

使用建造者模式后,代碼要比上面的方法多了不少:

創建頂層Builder

  1. public interface Builder { 
  2.  
  3.     void setCarType(CarType carType); 
  4.  
  5.     void setSeats(int seats); 
  6.  
  7.     void setEngine(Engine engine); 
  8.  
  9.     void setGPS(GPS gps); 

創建實體類,與上面是相同的,這里不重復了。

創建car的builder:

  1. @Data 
  2. public class CarBuilder implements Builder { 
  3.  
  4.     private CarType carType; 
  5.  
  6.     private int seats; 
  7.  
  8.     private Engine engine; 
  9.  
  10.     private GPS GPS; 
  11.  
  12.     public Car getResult() { 
  13.         return new Car(carType, seats, engine, GPS); 
  14.     } 

創建汽車操作手冊builder:

  1. @Data 
  2. public class ManualBuilder implements Builder { 
  3.  
  4.     private CarType carType; 
  5.  
  6.     private int seats; 
  7.  
  8.     private Engine engine; 
  9.  
  10.     private GPS GPS; 
  11.  
  12.     public Manual getResult() { 
  13.         return new Manual(carType, seats, engine, GPS); 
  14.     } 

創建一個builder管理器:

  1. public class Director { 
  2.  
  3.     public void constructSportsCar(Builder builder) { 
  4.         builder.setCarType(CarType.SPORT); 
  5.         builder.setSeats(2); 
  6.         builder.setEngine(new Engine(3.0, 0)); 
  7.         builder.setGPS(new GPS("上海東方明珠塔到上海動物園")); 
  8.     } 
  9.  
  10.     public void constructOrdinaryCar(Builder builder) { 
  11.         builder.setCarType(CarType.ORDINARY); 
  12.         builder.setSeats(4); 
  13.         builder.setEngine(new Engine(2.0, 0)); 
  14.         builder.setGPS(new GPS("上海東方明珠塔到上海動物園")); 
  15.     } 

測試類:

  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest(classes = TestApplication.class) 
  3. public class TestDemo { 
  4.  
  5.     @Test 
  6.     public void test() { 
  7.         Director director = new Director(); 
  8.         //生產跑車 
  9.         CarBuilder carBuilder = new CarBuilder(); 
  10.         director.constructSportsCar(carBuilder); 
  11.         Car sportCar = carBuilder.getResult(); 
  12.         sportCar.detail(); 
  13.         System.out.println("-----------------------------------"); 
  14.  
  15.         //生產普通汽車 
  16.         director.constructOrdinaryCar(carBuilder); 
  17.         Car ordinaryCar = carBuilder.getResult(); 
  18.         ordinaryCar.detail(); 
  19.         System.out.println("-----------------------------------"); 
  20.  
  21.         //生產汽車操作手冊 
  22.         ManualBuilder manualBuilder = new ManualBuilder(); 
  23.         director.constructOrdinaryCar(manualBuilder); 
  24.         Manual manual = manualBuilder.getResult(); 
  25.         manual.detail(); 
  26.         System.out.println("-----------------------------------"); 
  27.     } 

結果:

  1. this is SPORT car 
  2. the seats is :2 
  3. the engine is :Engine(volume=3.0, mileage=0.0) 
  4. this GPS is :GPS(route=上海東方明珠塔到上海動物園) 
  5. ----------------------------------- 
  6. this is ORDINARY car 
  7. the seats is :4 
  8. the engine is :Engine(volume=2.0, mileage=0.0) 
  9. this GPS is :GPS(route=上海東方明珠塔到上海動物園) 
  10. ----------------------------------- 
  11. this Manual ORDINARY car 
  12. the Manual seats is :4 
  13. the Manual engine is :Engine(volume=2.0, mileage=0.0) 
  14. this GManual PS is :GPS(route=上海東方明珠塔到上海動物園) 
  15. ----------------------------------- 

4、分析

建造者模式基本有以下幾個角色:

如上面兩種方式的結果顯示,都可以實現生產汽車和汽車手冊。

結果沒什么差異。

在沒使用建造者的方式中:

生產汽車的參數是由客戶端自己指定的,并且需要傳很多的參數,實際工作中可能需要更多的參數,可能有部分參數是不需要的。

使用建造者模式

用戶不需要去具體指定多個參數了,對于客戶端更友好。

builder:將產品new()提出到builder中,提供產品所擁有的屬性設置方法,一類產品都可以使用這個builder進行產品創建。

director:作為builder的管理者,主要控制產品的屬性設置,在這個類中,具體指定除了可以生產的產品的構造,并且對屬性進行賦值,最終返回一個用戶需要的builder。

客戶端調用只需要創建需要的產品類型builder,通過管理者director對builder進行屬性設置,最終客戶端通過調用builder的方法獲取最終需要的產品。

極大程度減少并優化的客戶端的代碼,同時由管理者director限制了產品的種類。

從擴展層層面看:

未使用建造者:增加對應的產品類,客戶端直接new。

使用建造者模式:增加builder,并且在director增加可創建的產品的builder構造。

5、總結

最后總結下上面例子中使用抽象工廠方法的優缺點:

優點:

1)遵守單一原則。

2)不同產品,可復用相同的產品創建流程。

3)簡化客戶端調用方式。去除多參構造的方式。

4)分步驟創建對象。

缺點:

增加多個類,代碼復雜度增加。

 

責任編輯:武曉燕 來源: 狼王編程
相關推薦

2021-10-26 00:21:19

設計模式建造者

2020-10-20 13:33:00

建造者模式

2021-07-08 11:28:43

觀察者模式設計

2021-04-14 09:02:22

模式 設計建造者

2020-11-05 09:38:07

中介者模式

2011-07-14 14:46:46

設計模式

2020-10-26 08:45:39

觀察者模式

2021-06-09 08:53:34

設計模式策略模式工廠模式

2012-01-13 15:59:07

2024-02-19 08:38:34

建造者模式Android設計模式

2013-11-26 17:09:57

Android設計模式

2020-12-01 07:16:05

重學設計模式

2021-03-05 07:57:41

設計模式橋接

2021-06-22 15:27:13

設計模式迭代器模式Java

2022-01-29 22:12:35

前端模式觀察者

2012-05-16 17:15:04

Java設計模式

2021-02-18 08:39:28

設計模式場景

2020-05-25 10:20:19

享元模式場景

2010-05-06 08:44:37

調解者模式

2021-06-10 19:09:05

模式代碼建造者
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久国产精品 | 国产视频一区在线 | 欧美自拍另类 | 欧美一级二级在线观看 | 一区二区三区高清在线观看 | 国外成人在线视频 | 亚洲一区在线日韩在线深爱 | 欧美精品在线免费观看 | 91精品一区二区 | 成人免费在线观看 | 国产区精品在线观看 | 欧美日韩亚洲一区 | 美女天天操 | 国产精品成人国产乱 | 久久精品一级 | 欧美不卡视频 | 欧美精品影院 | 国产精品人人做人人爽 | 在线观看成人精品 | 亚洲aⅴ| 久久久精品网 | 黄色在线免费观看 | 久久精品国产99国产精品 | 成人av观看 | 国产精品a一区二区三区网址 | 久久精品99国产精品 | 色伊人网 | 午夜精品一区 | 天天摸天天干 | 色综合九九 | 中文字幕在线一区 | 国产精品久久久 | 国产精品久久国产精品 | 狠狠爱免费视频 | 最新伦理片 | 亚洲国产成人久久综合一区,久久久国产99 | 色视频在线观看 | 免费在线视频a | 中文字幕免费视频 | 成人免费在线电影 | 国产精品一区二区三区四区 |