生活随笔
收集整理的這篇文章主要介紹了
设计模式_3_建造者模式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
建造者模式(BuilderPattern)
內(nèi)在的核心問(wèn)題就是: 使用多個(gè)簡(jiǎn)單對(duì)象根據(jù)一種組合關(guān)系構(gòu)造一個(gè)我們想要的復(fù)雜對(duì)象, 屬于創(chuàng)建型模式
- 建造者模式的角色關(guān)系
建造者模式中總共有兩種角色:
1.建造者: 負(fù)責(zé)建造每個(gè)基本組件
2.指揮者: 將建造者建造好的基本組件按照某種組合關(guān)系進(jìn)行拼裝
- 使用方式:
建造者模式具有兩部分組成: 基本組件( 維持在穩(wěn)定狀態(tài),不會(huì)輕易變化 ), 基本組件之間的組合關(guān)系( 組合關(guān)系總是多變的 );
1.先將每個(gè)簡(jiǎn)單的組件類(lèi)構(gòu)建出來(lái).
2.指揮者按照特定的建造順序調(diào)用組件類(lèi)對(duì)象舉個(gè)例子: 比如電腦的組裝, 組裝順序是固定的, 但是組裝的零件是可變的
3.在測(cè)試類(lèi)中通過(guò)指揮者對(duì)象選用需要的基本組件, 構(gòu)造復(fù)雜對(duì)象
優(yōu)點(diǎn): 基本組件獨(dú)立,易擴(kuò)展; 便于控制細(xì)節(jié)風(fēng)險(xiǎn)
缺點(diǎn): 構(gòu)建出來(lái)的復(fù)雜對(duì)象必須有公共點(diǎn), 構(gòu)建的范圍有限制; 生成對(duì)象之間具有一定的依賴關(guān)系
注: 建造者模式與工廠模式的區(qū)別-----建造者更關(guān)注零件的裝配順序, 將一個(gè)復(fù)雜的構(gòu)建過(guò)程與其表示相分離, 并不是由建造者負(fù)責(zé)一切, 而是由指揮者負(fù)責(zé)控制(定義)一個(gè)復(fù)雜的構(gòu)建過(guò)程, 由各個(gè)不同的建造者分別實(shí)現(xiàn)構(gòu)建過(guò)程所用到的構(gòu)建步驟
- 下面通過(guò)一個(gè)例子說(shuō)明:
基本組件: 漢堡, 冷飲, 紙盒, 瓶子
package com.BuilderPattern;
import java.util.ArrayList;
import java.util.List;/*** 快餐店案例, 套餐為漢堡,冷飲,包裝有紙盒,瓶子* @author regotto**/
public class BuilderPattern {//測(cè)試類(lèi)public static void main(String[] args) {MealBuilder mb=new MealBuilder();//測(cè)試類(lèi)中負(fù)責(zé)需要的點(diǎn)餐內(nèi)容Meal vegMeal=mb.prepareVegMeal(new VegBurger(), new Pepsi());vegMeal.showItems();System.out.println("Cost: "+vegMeal.getCost());}
}//針對(duì)所有基本組件的接口: 名字,包裝形式, 價(jià)格
interface Item{String name();Packing packing();double price();
}//指揮者: 搭配一次點(diǎn)餐內(nèi)容
class MealBuilder{//搭配方式是固定的, 漢堡+冷飲public Meal prepareVegMeal(Burger b, ColdDrink cd) {Meal meal=new Meal();meal.addItem(b);meal.addItem(cd);return meal;}
}//一次點(diǎn)餐包含的基本組件(使用ArrayList存儲(chǔ))
class Meal{private List<Item> items=new ArrayList<Item>();public void addItem(Item item) {items.add(item);}public double getCost() {double cost=0.0;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());}}
}
//基本組件包裝的接口: 包裝,包含紙盒,瓶子
interface Packing{public String pack();
}//包裝的實(shí)現(xiàn)類(lèi), 漢堡使用紙盒, 冷飲使用瓶子
class Wrapper implements Packing{public String pack() {return "Wrapper";}
}
class Bottle implements Packing{public String pack() {return "Bollte";}
}//抽象的漢堡組件
abstract class Burger implements Item{public Packing packing() {return new Wrapper();}
}
//漢堡組件的實(shí)現(xiàn)類(lèi)
class VegBurger extends Burger{public String name() {return "VegBurger";}public double price() {return 10.5;}
}
class ChickenBurger extends Burger{public String name() {return "ChickenBurger";}public double price() {return 15.5;}
}//抽象冷飲的基本組件
abstract class ColdDrink implements Item{public Packing packing() {return new Bottle();}
}
//冷飲的實(shí)現(xiàn)類(lèi)
class Pepsi extends ColdDrink{public String name() {return "Pepsi";}public double price() {return 3.50;}
}
class Coke extends ColdDrink{public String name() {return "Coke";}public double price() {return 5.50;}
}
上面有錯(cuò), 還請(qǐng)指出, 如果認(rèn)為我寫(xiě)的還不錯(cuò), 還請(qǐng)點(diǎn)個(gè)贊, 多多支持一下, O(∩_∩)O~~
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的设计模式_3_建造者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。