设计模式 生成器_生成器设计模式的应用
設(shè)計模式 生成器
嗨,您好!
今天,我將分享我制作的全新設(shè)計模式系列的第一個。 構(gòu)建器設(shè)計模式是開發(fā)嚴(yán)肅的應(yīng)用程序時非常有用且通用的模式。 在這篇文章中,我將提供一個很小的構(gòu)建器模式框架,因此您隨時可以回到這里并使用它。
助記符在處理構(gòu)建器模式時會考慮自定義。 當(dāng)我確定是否應(yīng)該使用它還是最好去工廠的時候,我總是在考慮它。 這樣對我更好。 嘗試一下。
UML
這是小框架的外觀。 簡單,美觀和直接。
背后的代碼
該代碼也非常簡單,小巧,簡潔且易于解釋。 我喜歡編碼表達(dá)力強的代碼,因此無需過多評論。 在此示例中,我這樣做了,因為它具有教程角色。 在開發(fā)過程中,我為自己創(chuàng)建了一些約定。 我認(rèn)為這樣做非常重要。 就像在開發(fā)時在語言上應(yīng)用正確的語法一樣。
例如:如果我使用的是Builder模式,則始終將后綴Builder放在最后。 好吧,您現(xiàn)在可以說或想:什么? 但這實際上對于初學(xué)者和經(jīng)驗豐富的開發(fā)人員來說是非常非常重要的信息。 他們將自動看到其背后的想法,并嘗試不破壞其模式。 實際上,經(jīng)驗豐富的開發(fā)人員會喜歡它并嘗試?yán)^續(xù)進行出色的工作,因為他們知道編寫此內(nèi)容的開發(fā)人員知道他的所作所為,并且肯定有原因。
因此,請始終保持足夠的清晰,并在正確的位置提供正確的信息。 稍后會有其他人感謝您。 但是現(xiàn)在到代碼了...
// 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(); }一個真實的例子
沒有什么比修復(fù)和更好地理解它更好的了。 讓我們建立一個蛋糕面包店。 您的一位同事想開一家面包店,并要求您為他編寫面包店的軟件。 我們開始做吧..!
順便說一句,我衷心地向您推薦,使用UML圖表工具作為一種可視化機制可以顯示您的想法并提高您的設(shè)計技能。 讓我們從UML開始:
比喻
現(xiàn)在,讓我們使用我們的微型框架,對我們的面包店進行類比。 成分是零件,配方是BuilderContract,而Builder是建造者本身。 Cake是最終的可定制產(chǎn)品。 CakeBuilder是實際在定制后(在添加了所需數(shù)量的零件–成分之后)實際創(chuàng)建產(chǎn)品的類。 客戶將是最終客戶或接受訂單的您的同事。 只是使用或想象...讓我們現(xiàn)在就深入研究代碼...
成分(部分)
我們示例中的部分是成分。 讓我們實現(xiàn)一些成分,以后再用它來制作蛋糕。
// 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;} }產(chǎn)品
在我們的示例中,要構(gòu)建的產(chǎn)品是蛋糕。
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
設(shè)計模式 生成器
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的设计模式 生成器_生成器设计模式的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Java中键入Safe SQL
- 下一篇: 流量多大了(多大流量才会被ddos)