設計模式-建造者模式例項-01
阿新 • • 發佈:2022-03-09
設計模式-建造者模式例項-01
要點:
建立一個複雜物件。
優點:
客戶端不必知道產品內部組成細節,將產品本身和產品建立過程解耦,使相同建立過程可建立不同產品物件;
具體建造者相對獨立,方便替換和增加,符合開閉原則;
可以更精細地控制產品建立過程。
缺點:
產品間差異性大的時候不適用;
內部變化複雜的話需要定義很多具體建造者類來實現變化。
適用環境:
將一個複雜物件的構建與它的表示分離,使同樣的構造過程可以建立不同的表示。
例項1:KFC套餐AB的建立。
類圖
程式碼實現:
程式碼結構:
Meal.java:
//產品類Meal(套餐類) public class Meal { privateString food; private String drink; public String getFood() { return food; } public void setFood(String food) { this.food = food; } public String getDrink() { return drink; } public void setDrink(String drink) { this.drink = drink; } }
MealBuilder.java:
//套餐建造者類 public abstract class MealBuilder { protected Meal meal = new Meal(); public abstract void buildFood(); public abstract void buildDrink(); public Meal getMeal(){ return meal; } }
SubMealBuilder:
SubMealBuilderA.java:
import BuilderPattern.MealBuilder;public class SubMealBuilderA extends MealBuilder { public void buildFood(){ meal.setFood("set a drumsticks!"); } public void buildDrink(){ meal.setDrink("set a cola!"); } }
SubMealBuilderB.java:
import BuilderPattern.MealBuilder; public class SubMealBuilderB extends MealBuilder { public void buildFood(){ meal.setFood("set a Chicken Rolls"); } public void buildDrink(){ meal.setDrink("set a juice"); } }
KFCWaiter.java:
public class KFCWaiter { private MealBuilder mb; public void setMealBuilder(MealBuilder mb){ this.mb = mb; } public Meal construct(){ mb.buildFood(); mb.buildDrink(); return mb.getMeal(); } }
XMLUtils.java:
import org.w3c.dom.*; import javax.xml.parsers.*; import org.xml.sax.SAXException; import java.io.*; public class XMLUtils { public static Object getBean(){ try { //建立文件物件 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("src/BuilderPattern/utils/config.xml")); //獲取包含支付方式名稱的文字節點 NodeList nl = doc.getElementsByTagName("className"); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); //通過類名生成例項物件並將其返回 Class c=Class.forName(cName); Object obj=c.newInstance(); return obj; }catch (Exception e){ e.printStackTrace(); return null; } } }
config.xml:
<?xml version="1.0"?> <config> <className>BuilderPattern.SubMealBuilder.SubMealBuilderA</className> </config>
Client.java:
import BuilderPattern.utils.XMLUtils; import abstractTVFactory.utils.XMLUtil; public class Client { public static void main(String[] args) { //動態確定套餐種類 MealBuilder mb = (MealBuilder) XMLUtils.getBean(); //服務員是指揮者 KFCWaiter waiter = new KFCWaiter(); //服務員準備套餐 waiter.setMealBuilder(mb); //客戶獲得套餐 Meal meal = waiter.construct(); System.out.println("套餐組成:"); System.out.println(meal.getFood()); System.out.println(meal.getDrink()); } }
測試結果: