日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

大话设计模式—建造者模式

發(fā)布時(shí)間:2024/4/14 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话设计模式—建造者模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

建造者模式(Builder Pattern)使用多個(gè)簡(jiǎn)單的對(duì)象一步一步構(gòu)建成一個(gè)復(fù)雜的對(duì)象。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。

一個(gè) Builder 類會(huì)一步一步構(gòu)造最終的對(duì)象。該 Builder 類是獨(dú)立于其他對(duì)象的。主要用于解決在軟件系統(tǒng)中,有時(shí)候面臨著”一個(gè)復(fù)雜對(duì)象”的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著劇烈的變化,但是將它們組合在一起的算法卻相對(duì)穩(wěn)定。簡(jiǎn)而言之,就是當(dāng)我們需要將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示的意圖時(shí),我們需要應(yīng)用建造者模式。

建造者模式可以將一個(gè)產(chǎn)品的內(nèi)部表象與產(chǎn)品生成過(guò)程分割開(kāi)來(lái),從而可以是一個(gè)建造過(guò)程生成具有不同的內(nèi)部表象的產(chǎn)品對(duì)象。如果我們使用了建造者模式,那么用戶就只需指定建造者的類型就可以得到它們,而具體建造的過(guò)程和細(xì)節(jié)就不需要知道了。

大話設(shè)計(jì)模式中程杰老師給出的定義是,建造者模式:將一個(gè)復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示

建造者模式結(jié)構(gòu)圖如下:

基本代碼如下:

//Product產(chǎn)品類,由多個(gè)對(duì)象組成 public class Prodct{List<String> productParts = new ArrayList<String>();//添加產(chǎn)品部件public void addProductParts(String productPart){productParts.add(productPart);}//列舉所有的產(chǎn)品部件public void show(){for(productPart : productParts){System.out.println(productPart);}} } //Builder抽象建造者類,確定產(chǎn)品有兩個(gè)部件PartA和PartB組成 public class abstract Builder{public abstract void builderPartA();public abstract void builderPartB();//聲明一個(gè)得到產(chǎn)品建造后結(jié)果的方法getResult()public abstract Product getResult();} //具體建造者類1 public class ConcreteBuilder1 extends Builder{private Product product = new Product();@overridepublic void buildPartA(){product.addProductParts("part A");}@overridepublic void buildPartB(){product.addProductParts("part B");}@overridepublic Product getResult(){return product;}} //具體建造者類2 public class ConcreteBuilder2 extends Builder{private Product product = new Product();@overridepublic void buildPartA(){product.addProductParts("part X");}@overridepublic void buildPartB(){product.addProductParts("part Y");}@overridepublic Product getResult(){return product;}} //指揮者類 public class Director{//用來(lái)指揮建造過(guò)程(根據(jù)傳入具體Builder實(shí)現(xiàn)類的不同來(lái)建造具有不同部件的對(duì)象)public void constructor(Builder builder){builder.buildPartA();builder.buildPartB();}} //測(cè)試方法 public static void main(String[] args){Director director = new Director();Builder b1 = new ConcreteBuilder1();director.constructor(b1);Product p1 = b1.getResult();p1.show();Builder b2 = new ConcreteBuilder2();director.constructor(b2);Product p2 = b2.getResult();p2.show(); }

建造者模式是在當(dāng)下創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)使用的模式。

再舉一個(gè)生活中常見(jiàn)的例子:

假設(shè)一個(gè)快餐店的商業(yè)案例,其中,一個(gè)典型的套餐可以是由以下部分組成:一個(gè)漢堡(Burger)和一杯冷飲(Cold drink)。因?yàn)闈h堡(Burger)可以是素食漢堡(Veg Burger)或雞肉漢堡(Chicken Burger),它們是包在紙盒中。冷飲(Cold drink)可以是可口可樂(lè)(coke)或百事可樂(lè)(pepsi),它們是裝在瓶子中,所以這個(gè)套餐的內(nèi)部組成有不同的方式,結(jié)合建造者模式的定義“將一個(gè)復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示”,該種案例完全可以使用建造者模式來(lái)實(shí)現(xiàn)。

我們將創(chuàng)建一個(gè)表示食物條目(比如漢堡和冷飲)的 Item 接口和實(shí)現(xiàn) Item 接口的實(shí)體類,以及一個(gè)表示食物包裝的 Packing 接口和實(shí)現(xiàn)Packing 接口的實(shí)體類,漢堡是包在紙盒中,冷飲是裝在瓶子中。
然后我們創(chuàng)建一個(gè) Meal 類,帶有 Item 的 ArrayList 和一個(gè)通過(guò)結(jié)合 Item 來(lái)創(chuàng)建不同類型的 Meal 對(duì)象的MealBuilder。BuilderPatternDemo,我們的演示類使用 MealBuilder 來(lái)創(chuàng)建一個(gè) Meal。

//創(chuàng)建表示食物條目的接口 public interface Item{public String name();public Packing packing();public float price();} //創(chuàng)建表示食物包裝的接口 public interface Packing{public String pack(); } //創(chuàng)建實(shí)現(xiàn)Packing接口的實(shí)體類—包裝紙包裝 public class Wrapper implements Packing{@overridepublic String pack(){return "Wrapper";}} //創(chuàng)建實(shí)現(xiàn)Packing接口的實(shí)體類—瓶子包裝 public class Bottle implements Packing{@overridepublic String pack(){return "Bootle";}} //創(chuàng)建了實(shí)現(xiàn)Item接口的抽象類漢堡類,該類提供了默認(rèn)的功能 public abstract class Burger implements itm{//漢堡采用包裝紙包裝@overridepublic Packing packing(){return new Wrapper();}@overridepublic abstract float price();} //創(chuàng)建了實(shí)現(xiàn)Item接口的抽象類冷飲類,該類提供了默認(rèn)的功能 public abstract class ColdDrink implements itm{//冷飲采用瓶子包裝@overridepublic Packing packing(){return new Bottle();}@overridepublic abstract float price();} //創(chuàng)建擴(kuò)展了Burger的實(shí)體類素食漢堡 public class VegBurger extends Burger{@overridepublic float price(){return 25.0f;}@overridepublic float name(){return "Veg Burger";} } //創(chuàng)建擴(kuò)展了Burger的實(shí)體類雞肉漢堡 public class ChickenBurger extends Burger{@overridepublic float price(){return 50.5f;}@overridepublic float name(){return "Chicken Burger";} } //創(chuàng)建擴(kuò)展了ColdDrink的實(shí)體類可口可樂(lè) public class Coke extends ColdDrink{@overridepublic float price(){return 30.0f;}@overridepublic float name(){return "Coke";} } //創(chuàng)建擴(kuò)展了ColdDrink的實(shí)體類百事可樂(lè) public class Pepsi extends ColdDrink{@overridepublic float price(){return 35.0f;}@overridepublic float name(){return "Pepsi";} } //創(chuàng)建一個(gè)套餐Meal類 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());} } } //創(chuàng)建一個(gè)MealBuilder類,實(shí)際的builder類負(fù)責(zé)創(chuàng)建套餐Meal對(duì)象。 public class MealBuilder {//素食套餐public Meal prepareVegMeal (){Meal meal = new Meal();meal.addItem(new VegBurger());//素食漢堡meal.addItem(new Coke());//可口可樂(lè)return meal;} //肉食套餐public Meal prepareNonVegMeal (){Meal meal = new Meal();meal.addItem(new ChickenBurger());//雞肉漢堡meal.addItem(new Pepsi());//百事可樂(lè)return meal;} } //測(cè)試方法 public classBuilderPatternTestDemo{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 chickenVegMeal = mealBuilder.prepareNonVegMeal();System.out.println("Chicken Veg Meal");chickenVegMeal.showItems();System.out.println("Total Cost: " +chickenVegMeal.getCost());}}

運(yùn)行結(jié)果:

Veg Meal Item : Veg Burger, Packing : Wrapper, Price : 25.0 Item : Coke, Packing : Bottle, Price : 30.0 Total Cost: 55.0Chicken Veg Meal Item : Chicken Burger, Packing : Wrapper, Price : 50.5 Item : Pepsi, Packing : Bottle, Price : 35.0 Total Cost: 85.5

使用實(shí)例:JAVA 中的 StringBuilder。

優(yōu)點(diǎn):

1、建造者獨(dú)立,易擴(kuò)展。
2、便于控制細(xì)節(jié)風(fēng)險(xiǎn)。

缺點(diǎn):

1、產(chǎn)品必須有共同點(diǎn),范圍有限制。
2、如內(nèi)部變化復(fù)雜,會(huì)有很多的建造類。

使用場(chǎng)景:

1、需要生成的對(duì)象具有復(fù)雜的內(nèi)部結(jié)構(gòu)。
2、需要生成的對(duì)象內(nèi)部屬性本身相互依賴。

注意事項(xiàng):與工廠模式的區(qū)別建造者模式更加關(guān)注與零件裝配的順序。

總結(jié)

以上是生活随笔為你收集整理的大话设计模式—建造者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。