WordPress旋轉(zhuǎn)圖標seo模板建站
1. 概述
建造者模式也稱為:生成器模式
定義:建造者模式是一種創(chuàng)建型設(shè)計模式,它允許你將創(chuàng)建復雜對象的步驟與表示方式相分離。
解釋:建造者模式就是將復雜對象的創(chuàng)建過程拆分成多個簡單對象的創(chuàng)建過程,并將這些簡單對象組合成復雜對象!
2. 優(yōu)缺點
優(yōu)點 | 缺點 |
|
|
|
|
|
3. 結(jié)構(gòu)
建造者模式包含以下幾個主要角色:
- 產(chǎn)品(Product):要構(gòu)建的復雜對象;產(chǎn)品類通常包含多個部分或者屬性,并由具體的建造者逐步構(gòu)建而成。
- 抽象建造者(Builder):定義了構(gòu)建產(chǎn)品的抽象接口,包括構(gòu)建產(chǎn)品的各個部分的方法;通常包括多個構(gòu)建方法和一個返回產(chǎn)品的方法。
- 具體建造者(Concrete Builder):實現(xiàn)了抽象建造者接口,具體確定如何構(gòu)建產(chǎn)品的各個部分,并負責返回最終構(gòu)建的產(chǎn)品。
- 指導者(Director):負責調(diào)用建造者的方法來構(gòu)建產(chǎn)品;指導者并不了解具體的構(gòu)建過程,只關(guān)心產(chǎn)品的構(gòu)建順序和方式。
4. 代碼實現(xiàn)
4.1. 需求介紹
我們假設(shè)一個快餐店的商業(yè)案例,其中,一個典型的套餐可以是一個漢堡(Burger)和一杯冷飲(Cold drink)。漢堡(Burger)可以是素食漢堡(Veg Burger)或雞肉漢堡(Chicken Burger),它們是包在紙盒中。冷飲(Cold drink)可以是可口可樂(coke)或百事可樂(pepsi),它們是裝在瓶子中。
我們將創(chuàng)建一個表示食物條目(比如漢堡和冷飲)的 Item 接口和實現(xiàn) Item 接口的實體類,以及一個表示食物包裝的 Packing 接口和實現(xiàn) Packing 接口的實體類,漢堡是包在紙盒中,冷飲是裝在瓶子中。
然后我們創(chuàng)建一個 Meal 類,帶有 Item 的 ArrayList 和一個通過結(jié)合 Item 來創(chuàng)建不同類型的 Meal 對象的 MealBuilder。BuilderPatternDemo 類使用 MealBuilder 來創(chuàng)建一個 Meal。
4.2. 代碼演示
- 創(chuàng)建一個代表食物條目和食物包裝的接口。
/*** @Description 食品條目接口* @Author gongming.Zhang* @Date 2024/11/1 15:54* @Version 1.0*/
public interface Item {// 商品名稱String name();// 包裝類型 (紙盒、瓶子)Packing packing();// 價格float price();
}
package top.zhang.builderdesignpatterns.entity.packing;/*** @Description 食物包裝條目接口* @Author gongming.Zhang* @Date 2024/11/1 15:56* @Version 1.0*/
public interface Packing {// 包裝類型(紙盒、瓶子)String pack();
}
- 創(chuàng)建并實現(xiàn)
Packing
接口的實體類。
/*** @Description 紙盒實現(xiàn)類* @Author gongming.Zhang* @Date 2024/11/1 15:57* @Version 1.0*/
public class Wrapper implements Packing {@Overridepublic String pack() {return "Wrapper";}
}
/*** @Description 瓶子實現(xiàn)類* @Author gongming.Zhang* @Date 2024/11/1 15:58* @Version 1.0*/
public class Bottle implements Packing {@Overridepublic String pack() {return "Bottle";}
}
- 創(chuàng)建并實現(xiàn)
Item
接口的抽象類,該類提供默認的功能。
/*** @Description 漢堡抽象類* @Author gongming.Zhang* @Date 2024/11/1 16:00* @Version 1.0*/
public abstract class Burger implements Item {@Overridepublic Packing packing() {return new Wrapper();}@Overridepublic abstract float price();
}
/*** @Description 冷飲抽象類* @Author gongming.Zhang* @Date 2024/11/1 16:24* @Version 1.0*/
public abstract class ColdDrink implements Item {@Overridepublic Packing packing() {return new Bottle();}@Overridepublic abstract float price();
}
- 創(chuàng)建并繼承
Burger
和ColdDrink
。
/*** @Description 雞肉漢堡實體類* @Author gongming.Zhang* @Date 2024/11/1 16:28* @Version 1.0*/
public class ChickenBurger extends Burger {@Overridepublic String name() {return "Chicken Burger";}@Overridepublic float price() {return 50.5f;}
}
/*** @Description 素食漢堡實體類* @Author gongming.Zhang* @Date 2024/11/1 16:26* @Version 1.0*/
public class VegBurger extends Burger {@Overridepublic String name() {return "Veg Burger";}@Overridepublic float price() {return 25.0f;}
}
/*** @Description 可口可樂實體類* @Author gongming.Zhang* @Date 2024/11/1 16:28* @Version 1.0*/
public class Coke extends ColdDrink {@Overridepublic String name() {return "Coke";}@Overridepublic float price() {return 30.0f;}
}
/*** @Description 百事可樂實體類* @Author gongming.Zhang* @Date 2024/11/1 16:30* @Version 1.0*/
public class Pepsi extends ColdDrink {@Overridepublic String name() {return "Pepsi";}@Overridepublic float price() {return 35.0f;}
}
- 創(chuàng)建一個
Meal
類,表示菜品實體。(產(chǎn)品)
package top.zhang.builderdesignpatterns.entity;import top.zhang.builderdesignpatterns.entity.food.Item;import java.util.ArrayList;
import java.util.List;/*** @Description 菜品實體類 —— 產(chǎn)品* @Author gongming.Zhang* @Date 2024/11/1 16:31* @Version 1.0*/
public class Meal {private List<Item> items = new ArrayList<Item>();public void addItem(Item item) {items.add(item);}/*** 獲取購買的商品總價** @return 商品總價格*/public float getCost() {float cost = 0.0f;for (Item item : items) {cost += item.price();}return cost;}/*** 展示購買的商品信息**/public void showItems() {for (Item item : items) {System.out.print("Item : "+item.name());System.out.print(", Packing : "+item.packing().pack());System.out.println(", Price : "+item.price());}}
}
- 創(chuàng)建一個
MealBuilder
類,實際的builder
類負責創(chuàng)建Meal
對象。(具體建造者)
package top.zhang.builderdesignpatterns.entity;import top.zhang.builderdesignpatterns.entity.food.entity.ChickenBurger;
import top.zhang.builderdesignpatterns.entity.food.entity.Coke;
import top.zhang.builderdesignpatterns.entity.food.entity.Pepsi;
import top.zhang.builderdesignpatterns.entity.food.entity.VegBurger;/*** @Description 負責構(gòu)建 Meal 對象 —— 具體建造者* @Author gongming.Zhang* @Date 2024/11/1 16:34* @Version 1.0*/
public class MealBuilder {/*** 構(gòu)建蔬菜餐數(shù)據(jù)** @return 菜品實體類*/public Meal prepareVegMeal() {Meal meal = new Meal();meal.addItem(new VegBurger());meal.addItem(new Coke());return meal;}/*** 構(gòu)建非蔬菜餐數(shù)據(jù)** @return 菜品實體類*/public Meal prepareNonVegMeal() {Meal meal = new Meal();meal.addItem(new ChickenBurger());meal.addItem(new Pepsi());return meal;}
}
- 測試建造者模式
@SpringBootTest
@RunWith(SpringRunner.class)
class BuilderDesignPatternsApplicationTests {@Testpublic void BuilderPatternDemo() {MealBuilder mealBuilder = new MealBuilder();Meal vegMeal = mealBuilder.prepareVegMeal();System.out.println("Veg Meal");vegMeal.showItems();System.out.println("total Cost: " + vegMeal.getCost());System.out.println("\n\n");Meal nonVegMeal = mealBuilder.prepareNonVegMeal();System.out.println("Non-Veg Meal");nonVegMeal.showItems();System.out.println("Total Cost: " +nonVegMeal.getCost());}
}
5. 總結(jié)
使用場景:
- 當需要創(chuàng)建一些特定的對象,但是它們擁有共同的組成部分時,比如:一個房子可以由個個部件:框架、墻、窗戶等,這些部件可以組合起來構(gòu)造完整的房子。
- 當對象的構(gòu)建過程比較復雜且需要多個步驟時,例如,創(chuàng)建一份電子商務(wù)訂單需要多個步驟,如選擇商品、填寫地址和支付等,這些步驟可以被分別封裝成為訂單構(gòu)建器中的不同方法。
- 當需要創(chuàng)建一些特定類型的對象,例如復雜的數(shù)據(jù)結(jié)構(gòu)或配置對象時,這在編寫配置文件解析器以及通用數(shù)據(jù)結(jié)構(gòu)如二叉樹等時很有用。
- 建造者模式也可以被用于通過更高級的方式來構(gòu)建復雜對象,例如:序列化和反序列化。
與抽象工廠模式的區(qū)別:
抽象工廠模式強調(diào)的是產(chǎn)品族的創(chuàng)建,即相關(guān)的產(chǎn)品一起被創(chuàng)建出來,而建造者模式強調(diào)的是一個復雜對象的創(chuàng)建,即它的各個部分逐步被創(chuàng)建出來。