爪哇一角

          共同探討STRUTS#HIBERNATE#SPRING#EJB等技術(shù)
          posts - 3, comments - 6, trackbacks - 0, articles - 99
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          建造者模式

          Posted on 2009-01-20 17:31 非洲小白臉 閱讀(1831) 評(píng)論(0)  編輯  收藏 所屬分類: 模式
          設(shè)計(jì)模式-快餐簡解-【建造者模式】

          建造者模式應(yīng)用場景舉例
          比如在玩“極品飛車”這款游戲,那么每一關(guān)的地圖會(huì)千變?nèi)f化,簡單的來說,地圖會(huì)有晴天和陰天之分,那么創(chuàng)建地圖時(shí)就要根據(jù)晴天或者陰天來對(duì)地圖上的 場景,比如:天空,樹,房子,和路面進(jìn)行渲染,這個(gè)過程是一個(gè)固定的,每創(chuàng)建一個(gè)新地圖都要執(zhí)行這幾個(gè)渲染,這是針對(duì)高級(jí)配置的電腦來說的。
          現(xiàn)在擁有低配置電腦的人不在少數(shù),那么他們就不能玩游戲了嗎?完全可以!只要將地圖中占用資源比較高的渲染去掉就可以,比如帶反射光影的樹,這時(shí)候需要?jiǎng)?chuàng)建不同的地圖,但地圖的創(chuàng)建過程卻是固定的,建造者模式完全可以應(yīng)對(duì)這樣的情況。

          建造者模式解釋
          類型:創(chuàng)建模式
            將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(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(
          "樹的顏色是淺綠色");
              }

              
          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(
          "樹的顏色是深綠色");
              }

              
          public void create_way() {
                  System.out.println(
          "路面有些潮濕");
              }

          }


          新建高畫質(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è)高畫質(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();

              }

          }


          新建低畫質(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è)低畫質(zhì)的地圖");
                  
          // 創(chuàng)建的順序很重要 從天空往路面創(chuàng)建
                  map_interface_ref.create_weather();
                  map_interface_ref.create_house();
                  
          // map_interface_ref.create_tree();將創(chuàng)建樹的過程去掉
                  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è)高畫質(zhì)的地圖
          陰天
          房了上玻璃發(fā)暗
          樹的顏色是深綠色
          路面有些潮濕

          創(chuàng)建一個(gè)低畫質(zhì)的地圖
          晴天
          房了上玻璃發(fā)亮
          路面有些干燥


          從程序中可以看到,建造者模式將不變的創(chuàng)建過程進(jìn)行封裝,創(chuàng)建的過程與main分法進(jìn)行分離,這樣內(nèi)部的創(chuàng)建過程就和表示層的代碼進(jìn)行分開,有利于創(chuàng) 建過程功能上的修改。另外可以發(fā)現(xiàn),代碼的設(shè)計(jì)和功能有些類似于facade外觀模式,區(qū)別在于,建造者模式目的在于以相同的構(gòu)建過程通過不同的建造者得 到不同的結(jié)果,而外觀模式并不需要不同的建造者,也不希望得到不同的結(jié)果,只是簡單的將幾個(gè)接口合并成高級(jí)的一個(gè)接口,不影響原有的結(jié)果,目的是使調(diào)用變 得更加容易。

            本程序中有2個(gè)建造者:高畫者建造者和低畫質(zhì)建造者,它們都封裝了創(chuàng)建地圖的過程,這個(gè)過程很固定,但通過不同的建造者類可以返回不樣式的地圖,建造者規(guī)定了對(duì)象創(chuàng)建的過程,比如高畫質(zhì)的建造者的創(chuàng)建過程為:
          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è)高畫質(zhì)的地圖,如果不使用建造者模式,直接調(diào)用map類的create_xxxx方法,如果create_xxxx 方法有幾十個(gè),那么很有可能就把其中的某些方法忘記調(diào)用而影響最終地圖的效果了,所以我們要使用建造者模式來規(guī)定地圖創(chuàng)建的過程,這就是一個(gè)“行為守則 ”。


          主站蜘蛛池模板: 田东县| 黄山市| 迭部县| 灵武市| 内江市| 承德县| 华安县| 梁山县| 旺苍县| 荔浦县| 怀远县| 如东县| 青田县| 卢龙县| 囊谦县| 广元市| 枞阳县| 沙河市| 定安县| 黄山市| 佛坪县| 新田县| 富裕县| 丹凤县| 青岛市| 丹巴县| 土默特左旗| 西充县| 宁海县| 浠水县| 哈巴河县| 武穴市| 罗江县| 延长县| 买车| 台东县| 达拉特旗| 巨野县| 宜阳县| 双峰县| 定远县|