生成器设计模式的应用
嗨,您好!
今天,我將分享我制作的全新設計模式系列的第一個。 構建器設計模式是開發嚴肅的應用程序時非常有用且通用的模式。 在這篇文章中,我將提供一個很小的構建器模式框架,因此您隨時可以回到這里并使用它。
助記符在處理構建器模式時會考慮自定義。 當我確定應該使用它還是最好去工廠時,我總是會考慮它。 這樣對我更好。 嘗試一下。
UML
這是小框架的外觀。 簡單,美觀和直接。
背后的代碼
該代碼也非常簡單,小巧,簡潔且易于解釋。 我喜歡編碼表達力強的代碼,因此無需過多評論。 在此示例中,我這樣做了,因為它具有教程角色。 在開發過程中,我為自己建立了一些約定。 我認為這樣做非常重要。 就像在開發時在語言上應用正確的語法一樣。
例如:如果我使用的是Builder模式,我總是將后綴Builder放在最后。 好吧,您現在可以說或想:什么? 但這實際上對于初學者和經驗豐富的開發人員來說是非常非常重要的信息。 他們將自動看到其背后的想法,并嘗試不破壞其模式。 實際上,經驗豐富的開發人員會喜歡它并嘗試繼續進行出色的工作,因為他們知道編寫此內容的開發人員知道他的所作所為,并且肯定有原因。
因此,請始終保持足夠的清晰,并在正確的位置提供正確的信息。 稍后會有其他人感謝您。 但是現在到代碼了...
// 1. EXAMPLE: PARTS OF THE CUSTOMIZABLE PRODUCT WE WANT public interface Part {// DEFINE THE METHODS YOUR PARTS WILL HAVE...void anyMethodNameYouLike(); }// 2. THE BUILDER METHOD WILL ADD // PARTS RETURNING THE BUILDER ITSELF public interface BuildContract < B > {B mount(Part part); }// 3. DEFINE THE BUILDER'S CONTRUCTION METHOD // WHICH BUILDS AND RETURNS THE FINAL PRODUCT "T" public interface Builder < T > extends BuildContract < Builder < T > > {T build(); }一個真實的例子
沒有什么比修復和更好地理解它更好的了。 讓我們建立一個蛋糕面包店。 您的一位同事想開一家面包店,并要求您為他編寫面包店的軟件。 我們開始做吧..!
順便說一句,我衷心地向您推薦,使用UML圖表工具是一種可視化機制,可以顯示您的想法并提高您的設計技能。 讓我們從UML開始:
比喻
現在,讓我們使用我們的微型框架,對我們的面包店進行類比。 成分是零件,配方是BuilderContract,而Builder是建造者本身。 Cake是最終的可定制產品。 CakeBuilder是在定制后實際創建產品的類(添加所需數量的零件-成分后)。 客戶將是最終客戶或接受訂單的您的同事。 只是使用或發揮想象力...現在讓我們深入研究代碼...
成分(部分)
我們示例中的部分是成分。 讓我們實現一些成分,以后再用它來制作蛋糕。
// 1. EXAMPLE: PART TO CUSTOMIZATE "INGREDIENTS" public interface Ingredient {// INGREDIENTS WILL HAVE...void printName();String getUnitPrice();void printCalories(); }public class LightMilk implements Ingredient {private int deciLiter;private int calories;private String unitPrice;public LightMilk(int deciLiter){this.deciLiter=deciLiter;}public LightMilk(int deciLiter, int calories, String unitPrice) {super();this.deciLiter = deciLiter;this.calories = calories;this.unitPrice = unitPrice;}@Override public void printName() {System.out.printf(" Light Milk");}@Override public String getUnitPrice() {return unitPrice;}@Override public void printCalories() {System.out.printf(" 76kc");}public int getDeciLiter() {return deciLiter;}public void setDeciLiter(int deciLiter) {this.deciLiter = deciLiter;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public void setUnitPrice(String unitPrice) {this.unitPrice = unitPrice;} } public class Sugar implements Ingredient {private int gram;private int calories;private String unitPrice;public Sugar(int deciLiter){this.gram=deciLiter;}public Sugar(int gram, int calories, String unitPrice) {super();this.gram = gram;this.calories = calories;this.unitPrice = unitPrice;}@Override public void printName() {System.out.printf(" Sugar");}@Override public String getUnitPrice() {return unitPrice;}@Override public void printCalories() {System.out.printf(" 40kc");}public int getGram() {return gram;}public void setGram(int gram) {this.gram = gram;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public void setUnitPrice(String unitPrice) {this.unitPrice = unitPrice;} } public class Choco implements Ingredient {private int gram;private int calories;private String unitPrice;public Choco(int gram, int calories, String unitPrice) {super();this.gram = gram;this.calories = calories;this.unitPrice = unitPrice;}public int getGram() {return gram;}public void setGram(int gram) {this.gram = gram;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public void setUnitPrice(String unitPrice) {this.unitPrice = unitPrice;}@Override public void printName() {System.out.printf(" Chocolate");}@Override public void printCalories() {System.out.printf(" 389kc");}@Override public String getUnitPrice() {return unitPrice;} } public class NoSugar implements Ingredient {private int gram;private int calories;private String unitPrice;public NoSugar(int deciLiter){this.gram=deciLiter;}public NoSugar(int gram, int calories, String unitPrice) {super();this.gram = gram;this.calories = calories;this.unitPrice = unitPrice;}@Override public void printName() {System.out.printf(" No Sugar");}@Override public String getUnitPrice() {return unitPrice;}@Override public void printCalories() {System.out.printf(" 0kc");}public int getGram() {return gram;}public void setGram(int gram) {this.gram = gram;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public void setUnitPrice(String unitPrice) {this.unitPrice = unitPrice;} } public class Milk implements Ingredient {private int deciLiter;private int calories;private String unitPrice;public Milk(int deciLiter){this.deciLiter=deciLiter;}public Milk(int deciLiter, int calories, String unitPrice) {super();this.deciLiter = deciLiter;this.calories = calories;this.unitPrice = unitPrice;}@Override public void printName() {System.out.printf(" Milk");}@Override public String getUnitPrice() {return unitPrice;}@Override public void printCalories() {System.out.printf(" 128kc");}public int getDeciLiter() {return deciLiter;}public void setDeciLiter(int deciLiter) {this.deciLiter = deciLiter;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public void setUnitPrice(String unitPrice) {this.unitPrice = unitPrice;} }建筑商合同
這是我們示例中的食譜。
// 2. THE BUILDER METHOD WILL ADD // INGREDIENTS RETURNING THE BUILDER ITSELF public interface Recipe < B > {B addIngredient(Ingredient ingredient); } // 3. DEFINE THE BUILDER CONTRUCTION METHOD // WHICH BUILDS AND RETURNS THE FINAL PRODUCT "T" public interface Builder < T > extends Recipe < Builder < T > > {T build(); } import java.util.ArrayList; import java.util.List; // 4. IMPLEMENT THE BUILDER ACC. TO YOUR NEEDS public class CakeBuilder implements Builder < Cake > {// IN THIS CASE THE PARTS ARE THE INGREDIENTSprivate List < Ingredient > ingredients=new ArrayList < Ingredient > ( );@Overridepublic Cake build() {if(!ingredients.isEmpty()){// THE FINAL PRODUCT IS A CHOCO-MUFFINreturn new Cake(ingredients);}return new Cake(null);}@Override// BECAUSE I ALWAYS GET A BUILDER BACK, I'M ABLE TO// ADD A LOT OF PARTS BEFORE I CALL "BUILD()"public Builder < Cake > addIngredient(Ingredient ingredient) {if(ingredient!=null){ingredients.add(ingredient);}return this;} }產品
在我們的示例中,要構建的產品是蛋糕。
import java.util.List;public class Cake {public Cake(List < Ingredient > ingredients){String muffin = "";if(ingredients==null){System.out.println(" zero cake "+muffin);return;}// PRINT OUT MUFFIN INGREDIENTSSystem.out.printf(" Cake with: ");for (Ingredient ingredient : ingredients) {ingredient.printName();}// PRINT OUT PART PRICESfor (Ingredient ingredient : ingredients) {muffin+=" "+ingredient.getUnitPrice();//NOPMD}System.out.println(" - Price: "+muffin);}public void printResult(){System.out.println(" Cake is ready!");} }測試它
最后客戶端測試。 在這里我們可以看到它的用法:
// 5. TESTING THE CHOCO-BUILDER public class Client {public static void main(String[] args) {Builder < Cake > chocoMuffinBuilder = new CakeBuilder();chocoMuffinBuilder.addIngredient(new Choco(10, 23, "3.39"));chocoMuffinBuilder.addIngredient(new Milk(34, 67, "1.57"));chocoMuffinBuilder.addIngredient(new Sugar(34, 67, "2.00"));final Cake chocoMuffin = chocoMuffinBuilder.build();chocoMuffin.printResult();} }就這樣! 希望你喜歡!
翻譯自: https://www.javacodegeeks.com/2014/08/builder-design-pattern-applied.html
總結
以上是生活随笔為你收集整理的生成器设计模式的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux分配磁盘空间(linux 分配
- 下一篇: JavaFX技巧5:可观察