Builder Pattern giúp chúng ta xây dựng một object phức tạp từ những object đơn giản qua từng bước. Builder Pattern được xếp vào nhóm các pattern Khởi .
Một class Builder luôn luôn xây dựng object thực thể cuối cùng qua từng bước. Bản thân Builder luôn luôn độc lập và không lệ thuộc vào các object khác.
Áp dụng triển khai

- Chúng ta sẽ tạo
01 abstract class Itemđể biểu thị hàng hóa và cácclassđể mô tả các thực thể. - Giao diện
Packingthể hiện cách đóng gói của sản phẩm. - Sau đó, chúng ta tạo ra
01 class Mealcó chứa một mảngItem. - Và tạo
01 class Builderđể thực hiện công việc tổ hợp nên cácobject Mealkhác nhau bằng việc kết hợp cácItem. - Cuối cùng là code
mainsử dụngBuilderđể xây dựng mộtMeal.
Về mặt quản lý code, chúng ta sẽ có 01 package có tên là mealbuilder. Phần code client trên main sẽ chỉ cần tham chiếu tới Builder và Meal do đó sẽ chỉ có 02 class này được mở public. Tất cả các thành phần còn lại của package sẽ đều được đặt access modifier là default.
Bước 1
Tạo abstract class Item và interface Packing.
mealbuilder/Item.java
packagemealbuilder;abstractclassItem{privatefinalString name;privatefinalfloat price;privatefinalPacking packing;Item(String name,float price,Packing packing
){this.name = name;this.price = price;this.packing = packing;}publicStringgetName(){return name;}publicfloatgetPrice(){return price;}publicPackinggetPacking(){return packing;}}
mealbuilder/Packing.java
packagemealbuilder;interfacePacking{publicStringpack();}
Bước 2
Tạo các class triển khai của Packing.
mealbuilder/Wrapper.java
packagemealbuilder;classWrapperimplementsPacking{@OverridepublicStringpack(){return"Wrapper";}}
mealbuilder/Bottle.java
packagemealbuilder;classBottleimplementsPacking{@OverridepublicStringpack(){return"Bottle";}}
Bước 3
Tạo các class Burger mở rộng Item.
mealbuilder/Burger.java
packagemealbuilder;publicabstractclassBurgerextendsItem{Burger(String name,float price,Packing packing
){super(name, price, packing);}}
mealBuilder/BurgerForVeg.java
packagemealbuilder;classBurgerForVegextendsBurger{BurgerForVeg(){super("Bugger for Veg",25.0f,newWrapper());}}
mealBuilder/BurgerNonVeg.java
packagemealbuilder;classBurgerNonVegextendsBurger{BurgerNonVeg(){super("Burger non-Veg",50.5f,newWrapper());}}
Bước 4
Tạo các class Drink mở rộng Item tương tự như Burger.
mealbuilder/Drink.java
packagemealbuilder;publicabstractclassDrinkextendsItem{Drink(String name,float price,Packing packing
){super(name, price, packing);}}
mealbuilder/DrinkCoke.java
packagemealbuilder;classDrinkCokeextendsDrink{DrinkCoke(){super("Coke",30.0f,newBottle());}}
mealbuilder/DrinkPepsi.java
packagemealbuilder;classDrinkPepsiextendsDrink{DrinkPepsi(){super("Pepsi",35.0f,newBottle());}}
Bước 5
Tạo class Meal chứa các object Item.
mealbuilder/Meal.java
packagemealbuilder;importjava.util.ArrayList;importjava.util.List;publicclassMeal{privateList<Item> itemList =newArrayList<Item>();publicvoidaddItem(Item newItem){
itemList.add(newItem);}publicfloatgetCost(){float totalCost =0.0f;for(Item i : itemList){ totalCost += i.getPrice();}return totalCost;}publicvoidshowItems(){for(Item i : itemList){System.out.println(i.getName());System.out.println(" + Packing: "+ i.getPacking().pack());System.out.println(" + Price: "+ i.getPrice());}}}
Bước 6
Tạo class Builder giúp xây dựng các object Meal.
mealbuilder/Builder.java
packagemealbuilder;publicclassBuilder{publicMealprepareMealForVeg(){Meal mealForVeg =newMeal();
mealForVeg.addItem(newBurgerForVeg());
mealForVeg.addItem(newDrinkCoke());return mealForVeg;}publicMealprepareMealNonVeg(){Meal mealNonVeg =newMeal();
mealNonVeg.addItem(newBurgerNonVeg());
mealNonVeg.addItem(newDrinkPepsi());return mealNonVeg;}}
Bước 7
Code main tại PatternDemo để chạy thử pattern.
PatternDemo.java
importmealbuilder.Builder;importmealbuilder.Meal;publicclassPatternDemo{publicstaticvoidmain(String[] args){Builder mealBuilder =newBuilder();Meal mealForVeg = mealBuilder.prepareMealForVeg();System.out.println("=== Meal for Veg ========");
mealForVeg.showItems();System.out.println("Total cost: "+ mealForVeg.getCost());Meal mealNonVeg = mealBuilder.prepareMealNonVeg();System.out.println("=== Meal non-Veg ========");
mealNonVeg.showItems();System.out.println("Total cost: "+ mealNonVeg.getCost());}}
Bước 8
Kiểm chứng lại thông tin được in ra ở console.
console
=== Meal for Veg ========
Bugger for Veg
+ Packing: Wrapper
+ Price: 25.0
Coke
+ Packing: Bottle
+ Price: 30.0
Total cost: 55.0
=== Meal non-Veg ========
Burger non-Veg
+ Packing: Wrapper
+ Price: 50.5
Pepsi
+ Packing: Bottle
+ Price: 35.0
Total cost: 85.5
Nguồn: viblo.asia
