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
Packing
thể hiện cách đóng gói của sản phẩm. - Sau đó, chúng ta tạo ra
01 class Meal
có 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 Meal
khác nhau bằng việc kết hợp cácItem
. - Cuối cùng là code
main
sử 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