Posted on 2009-01-20 17:31
非洲小白臉 閱讀(1829)
評(píng)論(0) 編輯 收藏 所屬分類:
模式
設(shè)計(jì)模式-快餐簡(jiǎn)解-【建造者模式】
【
建造者模式應(yīng)用場(chǎng)景舉例】
比如在玩“極品飛車”這款游戲,那么每一關(guān)的地圖會(huì)千變?nèi)f化,簡(jiǎn)單的來(lái)說(shuō),地圖會(huì)有晴天和陰天之分,那么創(chuàng)建地圖時(shí)就要根據(jù)晴天或者陰天來(lái)對(duì)地圖上的
場(chǎng)景,比如:天空,樹(shù),房子,和路面進(jìn)行渲染,這個(gè)過(guò)程是一個(gè)固定的,每創(chuàng)建一個(gè)新地圖都要執(zhí)行這幾個(gè)渲染,這是針對(duì)高級(jí)配置的電腦來(lái)說(shuō)的。
現(xiàn)在擁有低配置電腦的人不在少數(shù),那么他們就不能玩游戲了嗎?完全可以!只要將地圖中占用資源比較高的渲染去掉就可以,比如帶反射光影的樹(shù),這時(shí)候需要?jiǎng)?chuàng)建不同的地圖,但地圖的創(chuàng)建過(guò)程卻是固定的,建造者模式完全可以應(yīng)對(duì)這樣的情況。
【
建造者模式解釋】
類型:創(chuàng)建模式
將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
【
建造者模式UML圖】
【
建造者模式-JAVA代碼實(shí)現(xiàn)】
新建地圖接口:
package map_package;
public interface map_interface {
public void create_weather();
public void create_house();
public void create_tree();
public void create_way();
}
新建晴天地圖類:
package map_package;
public class map_sun implements map_interface {
public void create_weather() {
System.out.println("晴天");
}
public void create_house() {
System.out.println("房了上玻璃發(fā)亮");
}
public void create_tree() {
System.out.println("樹(shù)的顏色是淺綠色");
}
public void create_way() {
System.out.println("路面有些干燥");
}
}
新建陰天地圖類:
package map_package;
public class map_cloudy implements map_interface{
public void create_weather() {
System.out.println("陰天");
}
public void create_house() {
System.out.println("房了上玻璃發(fā)暗");
}
public void create_tree() {
System.out.println("樹(shù)的顏色是深綠色");
}
public void create_way() {
System.out.println("路面有些潮濕");
}
}
新建高畫(huà)質(zhì)builder建造者類:
package map_build;
import map_package.map_interface;
public class map_build_adv {
private map_interface map_interface_ref;
public map_build_adv(map_interface map_interface_ref) {
super();
this.map_interface_ref = map_interface_ref;
}
public void create_map() {
System.out.println("創(chuàng)建一個(gè)高畫(huà)質(zhì)的地圖");
// 創(chuàng)建的順序很重要 從天空往路面創(chuàng)建
map_interface_ref.create_weather();
map_interface_ref.create_house();
map_interface_ref.create_tree();
map_interface_ref.create_way();
}
}
新建低畫(huà)質(zhì)builder建造者類:
package map_build;
import map_package.map_interface;
public class map_build_low {
private map_interface map_interface_ref;
public map_build_low(map_interface map_interface_ref) {
super();
this.map_interface_ref = map_interface_ref;
}
public void create_map() {
System.out.println("創(chuàng)建一個(gè)低畫(huà)質(zhì)的地圖");
// 創(chuàng)建的順序很重要 從天空往路面創(chuàng)建
map_interface_ref.create_weather();
map_interface_ref.create_house();
// map_interface_ref.create_tree();將創(chuàng)建樹(shù)的過(guò)程去掉
map_interface_ref.create_way();
}
}
新建客戶端運(yùn)行類:
package run_main;
import map_build.map_build_adv;
import map_build.map_build_low;
import map_package.map_cloudy;
import map_package.map_sun;
public class run_main {
public static void main(String[] args) {
map_cloudy map_cloudy = new map_cloudy();
map_build_adv map_build_adv = new map_build_adv(map_cloudy);
map_build_adv.create_map();
System.out.println();
map_sun map_sun = new map_sun();
map_build_low map_build_low = new map_build_low(map_sun);
map_build_low.create_map();
}
}
程序運(yùn)行結(jié)果如下:
創(chuàng)建一個(gè)高畫(huà)質(zhì)的地圖
陰天
房了上玻璃發(fā)暗
樹(shù)的顏色是深綠色
路面有些潮濕
創(chuàng)建一個(gè)低畫(huà)質(zhì)的地圖
晴天
房了上玻璃發(fā)亮
路面有些干燥
從程序中可以看到,建造者模式將不變的創(chuàng)建過(guò)程進(jìn)行封裝,創(chuàng)建的過(guò)程與main分法進(jìn)行分離,這樣內(nèi)部的創(chuàng)建過(guò)程就和表示層的代碼進(jìn)行分開(kāi),有利于創(chuàng)
建過(guò)程功能上的修改。另外可以發(fā)現(xiàn),代碼的設(shè)計(jì)和功能有些類似于facade外觀模式,區(qū)別在于,建造者模式目的在于以相同的構(gòu)建過(guò)程通過(guò)不同的建造者得
到不同的結(jié)果,而外觀模式并不需要不同的建造者,也不希望得到不同的結(jié)果,只是簡(jiǎn)單的將幾個(gè)接口合并成高級(jí)的一個(gè)接口,不影響原有的結(jié)果,目的是使調(diào)用變
得更加容易。
本程序中有2個(gè)建造者:高畫(huà)者建造者和低畫(huà)質(zhì)建造者,它們都封裝了創(chuàng)建地圖的過(guò)程,這個(gè)過(guò)程很固定,但通過(guò)不同的建造者類可以返回不樣式的地圖,建造者規(guī)定了對(duì)象創(chuàng)建的過(guò)程,比如高畫(huà)質(zhì)的建造者的創(chuàng)建過(guò)程為:
map_interface_ref.create_weather();
map_interface_ref.create_house();
map_interface_ref.create_tree();
map_interface_ref.create_way();
必須得執(zhí)行4個(gè)方法才可以創(chuàng)建一個(gè)高畫(huà)質(zhì)的地圖,如果不使用建造者模式,直接調(diào)用map類的create_xxxx方法,如果create_xxxx
方法有幾十個(gè),那么很有可能就把其中的某些方法忘記調(diào)用而影響最終地圖的效果了,所以我們要使用建造者模式來(lái)規(guī)定地圖創(chuàng)建的過(guò)程,這就是一個(gè)“行為守則
”。