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

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

開發(fā) 前端
建造者模式是一種創(chuàng)建型設(shè)計(jì)模式, 使你能夠分步驟創(chuàng)建復(fù)雜對象。該模式允許你使用相同的創(chuàng)建代碼生成不同類型和形式的對象。

[[377314]]

本文轉(zhuǎn)載自微信公眾號「狼王編程」,作者狼王 。轉(zhuǎn)載本文請聯(lián)系狼王編程公眾號。  

 1、概述

建造者模式是一種創(chuàng)建型設(shè)計(jì)模式, 使你能夠分步驟創(chuàng)建復(fù)雜對象。該模式允許你使用相同的創(chuàng)建代碼生成不同類型和形式的對象。

2、適用場景

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

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

3、實(shí)例

有以下場景,我們分別使用常規(guī)方式和建造者模式實(shí)現(xiàn):

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

不使用建造者模式

分別創(chuàng)建車car和手冊manual,以及其內(nèi)部的屬性,當(dāng)前例子中車和手冊是相同的屬性。

  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.         //生產(chǎn)跑車 
  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.         //生產(chǎn)普通汽車 
  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.         //生產(chǎn)汽車操作手冊 
  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.     } 

結(jié)果:

  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. ---------------------------------------- 

使用建造者模式實(shí)現(xiàn)

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

創(chuàng)建頂層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); 

創(chuàng)建實(shí)體類,與上面是相同的,這里不重復(fù)了。

創(chuàng)建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.     } 

創(chuàng)建汽車操作手冊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.     } 

創(chuàng)建一個(gè)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.         //生產(chǎn)跑車 
  9.         CarBuilder carBuilder = new CarBuilder(); 
  10.         director.constructSportsCar(carBuilder); 
  11.         Car sportCar = carBuilder.getResult(); 
  12.         sportCar.detail(); 
  13.         System.out.println("-----------------------------------"); 
  14.  
  15.         //生產(chǎn)普通汽車 
  16.         director.constructOrdinaryCar(carBuilder); 
  17.         Car ordinaryCar = carBuilder.getResult(); 
  18.         ordinaryCar.detail(); 
  19.         System.out.println("-----------------------------------"); 
  20.  
  21.         //生產(chǎn)汽車操作手冊 
  22.         ManualBuilder manualBuilder = new ManualBuilder(); 
  23.         director.constructOrdinaryCar(manualBuilder); 
  24.         Manual manual = manualBuilder.getResult(); 
  25.         manual.detail(); 
  26.         System.out.println("-----------------------------------"); 
  27.     } 

結(jié)果:

  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、分析

建造者模式基本有以下幾個(gè)角色:

如上面兩種方式的結(jié)果顯示,都可以實(shí)現(xiàn)生產(chǎn)汽車和汽車手冊。

結(jié)果沒什么差異。

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

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

使用建造者模式

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

builder:將產(chǎn)品new()提出到builder中,提供產(chǎn)品所擁有的屬性設(shè)置方法,一類產(chǎn)品都可以使用這個(gè)builder進(jìn)行產(chǎn)品創(chuàng)建。

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

客戶端調(diào)用只需要創(chuàng)建需要的產(chǎn)品類型builder,通過管理者director對builder進(jìn)行屬性設(shè)置,最終客戶端通過調(diào)用builder的方法獲取最終需要的產(chǎn)品。

極大程度減少并優(yōu)化的客戶端的代碼,同時(shí)由管理者director限制了產(chǎn)品的種類。

從擴(kuò)展層層面看:

未使用建造者:增加對應(yīng)的產(chǎn)品類,客戶端直接new。

使用建造者模式:增加builder,并且在director增加可創(chuàng)建的產(chǎn)品的builder構(gòu)造。

5、總結(jié)

最后總結(jié)下上面例子中使用抽象工廠方法的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

1)遵守單一原則。

2)不同產(chǎn)品,可復(fù)用相同的產(chǎn)品創(chuàng)建流程。

3)簡化客戶端調(diào)用方式。去除多參構(gòu)造的方式。

4)分步驟創(chuàng)建對象。

缺點(diǎn):

增加多個(gè)類,代碼復(fù)雜度增加。

 

責(zé)任編輯:武曉燕 來源: 狼王編程
相關(guān)推薦

2020-10-20 13:33:00

建造者模式

2021-10-26 00:21:19

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

2021-07-08 11:28:43

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

2020-11-05 09:38:07

中介者模式

2021-04-14 09:02:22

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

2011-07-14 14:46:46

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

2020-10-26 08:45:39

觀察者模式

2012-01-13 15:59:07

2021-06-09 08:53:34

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

2024-02-19 08:38:34

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

2013-11-26 17:09:57

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

2020-12-01 07:16:05

重學(xué)設(shè)計(jì)模式

2021-06-22 15:27:13

設(shè)計(jì)模式迭代器模式Java

2021-03-05 07:57:41

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

2022-01-29 22:12:35

前端模式觀察者

2012-05-16 17:15:04

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

2021-02-18 08:39:28

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

2020-05-25 10:20:19

享元模式場景

2010-05-06 08:44:37

調(diào)解者模式

2021-06-10 19:09:05

模式代碼建造者
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 免费观看一级毛片视频 | 麻豆精品国产91久久久久久 | 亚洲精品国产区 | 国产精品久久久久久婷婷天堂 | 成人在线网 | 国产精品区二区三区日本 | 一区二区三区视频在线 | 操久久| 91精品免费 | 色视频网站 | 日干夜操 | 国产精品欧美一区二区 | 国产黄色小视频在线观看 | 亚洲精品成人 | 亚洲女人天堂成人av在线 | 亚洲区在线 | 天天看天天操 | 中文字幕视频在线观看 | 国产精品免费看 | 精品福利视频一区二区三区 | 欧美精品免费观看二区 | 狠狠的操| 97视频成人 | 性色av一区二区三区 | 日韩电影一区二区三区 | 天天综合久久 | 久久精品一区二 | 成人福利网| 91亚洲国产成人久久精品网站 | 成人妇女免费播放久久久 | 四虎永久在线精品免费一区二 | 特级黄一级播放 | 美女黄网 | 欧美日韩综合一区 | 日韩成人| 九九九视频精品 | 午夜在线 | 亚洲乱码国产乱码精品精98午夜 | 亚洲视频一区在线观看 | 热久色 | 999热精品视频 |