[Design Patterns] Builder Pattern

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

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

sơ đồ các class

  • Chúng ta sẽ tạo 01 abstract class Item để biểu thị hàng hóa và các class để 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ảng Item.
  • Và tạo 01 class Builder để thực hiện công việc tổ hợp nên các object Meal khác nhau bằng việc kết hợp các Item.
  • Cuối cùng là code main sử dụng Builder để xây dựng một Meal.

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

Bước 1

Tạo abstract class Iteminterface 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

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ