鍍金池/ 教程/ Java/ Java建造者(Builder)模式
Java前端控制器模式
Java工廠設(shè)計(jì)模式
Java抽象工廠模式
Java觀察者模式
Java門面模式(或外觀模式)
Java備忘錄模式
Java MVC模式
Java單例模式
Java傳輸對象模式
Java迭代器模式
Java責(zé)任鏈模式
Java命令模式
Java原型模式
Java解釋器模式
Java適配器模式
Java狀態(tài)模式
Java中介者模式(Mediator Pattern)
Java攔截過濾器模式
Java策略模式
Java組合模式
Java業(yè)務(wù)代理模式
Java裝飾模式
Java模板模式
Java橋接模式
Java過濾器模式(條件模式)
Java享元模式(Flyweight Pattern)
Java建造者(Builder)模式
Java設(shè)計(jì)模式
Java空對象模式
Java數(shù)據(jù)訪問對象模式
Java訪問者模式
Java組合實(shí)體模式
Java服務(wù)定位器模式

Java建造者(Builder)模式

構(gòu)建器(Builder)模式使用簡單對象并使用逐步方法構(gòu)建復(fù)雜對象。 這種類型的設(shè)計(jì)模式屬于創(chuàng)建模式,因?yàn)榇四J教峁┝藙?chuàng)建對象的最佳方法之一。

構(gòu)建器(Builder)模式構(gòu)建器逐步構(gòu)建最終對象,此構(gòu)建器獨(dú)立于其他對象。

實(shí)例實(shí)例

我們考慮了一家快餐店的商業(yè)案例,其中典型的餐點(diǎn)可能是漢堡和冷飲。 漢堡可以是一個(gè)素食漢堡或雞肉漢堡,將被包裝進(jìn)行包裝。 冷飲可以是一個(gè)可樂或百事將裝放在一個(gè)瓶子中。

我們將創(chuàng)建一個(gè)Item接口,表示食品項(xiàng)目,如漢堡包和冷飲料以及實(shí)現(xiàn)Item接口的具體類。還有一個(gè)包裝接口,表示食品包裝和實(shí)現(xiàn)包裝接口的具體類,因?yàn)闈h堡包裝在包裝和冷飲將包裝成瓶子。

然后創(chuàng)建一個(gè)具有ItemListListMealBuilderMeal類,通過組合Item來構(gòu)建不同類型的Meal對象。 BuilderPatternDemo這是一個(gè)演示類將使用MealBuilder構(gòu)建一個(gè)食品套餐。

第1步

創(chuàng)建兩個(gè)接口分別代表食品和包裝的項(xiàng)目(ItemPacking),如下所示 -

Item.java

public interface Item {
   public String name();
   public Packing packing();
   public float price();    
}

Packing.java

public interface Packing {
   public String pack();
}

第2步

創(chuàng)建實(shí)現(xiàn)Packing接口的具體類。如下代碼所示 -

Wrapper.java

public class Wrapper implements Packing {

   @Override
   public String pack() {
      return "Wrapper";
   }
}

Bottle.java

public class Bottle implements Packing {

   @Override
   public String pack() {
      return "Bottle";
   }
}

第3步

創(chuàng)建抽象類實(shí)現(xiàn)Item接口提供默認(rèn)功能。

Burger.java

public abstract class Burger implements Item {

   @Override
   public Packing packing() {
      return new Wrapper();
   }

   @Override
   public abstract float price();
}

ColdDrink.java

public abstract class ColdDrink implements Item {

    @Override
    public Packing packing() {
       return new Bottle();
    }

    @Override
    public abstract float price();
}

第4步

創(chuàng)建擴(kuò)展?jié)h堡(Burger)和冷飲(ColdDrink )類的具體類

VegBurger.java

public class VegBurger extends Burger {

   @Override
   public float price() {
      return 25.0f;
   }

   @Override
   public String name() {
      return "Veg Burger";
   }
}

ChickenBurger.java

public class ChickenBurger extends Burger {

   @Override
   public float price() {
      return 50.5f;
   }

   @Override
   public String name() {
      return "Chicken Burger";
   }
}

Coke.java

public class Coke extends ColdDrink {

   @Override
   public float price() {
      return 30.0f;
   }

   @Override
   public String name() {
      return "Coke";
   }
}

Pepsi.java

public class Pepsi extends ColdDrink {

   @Override
   public float price() {
      return 35.0f;
   }

   @Override
   public String name() {
      return "Pepsi";
   }
}

第5步

創(chuàng)建一個(gè)具有上面定義的Item對象的Meal類。

Meal.java

import java.util.ArrayList;
import java.util.List;

public class Meal {
   private List<Item> items = new ArrayList<Item>();    

   public void addItem(Item item){
      items.add(item);
   }

   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());
      }        
   }    
}

第6步

創(chuàng)建一個(gè)MealBuilder類,這是一個(gè)實(shí)際的構(gòu)建類負(fù)責(zé)創(chuàng)建Meal對象。

MealBuilder.java

public class MealBuilder {

   public Meal prepareVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new VegBurger());
      meal.addItem(new Coke());
      return meal;
   }   

   public Meal prepareNonVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new ChickenBurger());
      meal.addItem(new Pepsi());
      return meal;
   }
}

第7步

BuiderPatternDemo類使用MealBuider對象來演示構(gòu)建器模式。

BuilderPatternDemo.java

public class BuilderPatternDemo {
   public static void main(String[] args) {

      MealBuilder mealBuilder = new MealBuilder();

      Meal vegMeal = mealBuilder.prepareVegMeal();
      System.out.println("Veg Meal");
      vegMeal.showItems();
      System.out.println("Total Cost: " + vegMeal.getCost());

      Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
      System.out.println("\n\nNon-Veg Meal");
      nonVegMeal.showItems();
      System.out.println("Total Cost: " + nonVegMeal.getCost());
   }
}

第8步

驗(yàn)證輸出,執(zhí)行上面代碼得到如下結(jié)果 -

Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total Cost: 55.0


Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5