<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                第8章 工廠方法模式 8.1 女媧造人的故事 東漢《風俗通》記錄了一則神話故事:“開天辟地,未有人民,女媧搏黃土做人”,講述的內容就是大家非常熟悉的女媧造人的故事。開天辟地之初,大地上并沒有生物,只有蒼茫大地,純粹而潔凈的自然環境,寂靜而又寂寞,于是女媧決定創造一個新物種(即人類)來增加世界的繁榮,怎么制造呢? 別忘了女媧是神仙,沒有辦不到的事情,造人的過程是這樣的:首先,女媧采集黃土捏成人的形狀,然后放到八卦爐中燒制,最后放置到大地上生長,工藝過程是沒有錯的,但是意外隨時都會發生: 第一次烤泥人,感覺應該熟了,往大地上一放,哇,沒烤熟!于是一個白人誕生了!(這也是缺乏經驗的最好證明。) 第二次烤泥人,上一次沒烤熟,這次多烤一會兒,放到世間一看,嘿,熟過頭了,于是黑人誕生了! 第三次烤泥人,一邊燒制一邊察看,直到表皮微黃,嘿,剛剛好,于是黃色人種出現了! 這個造人過程是比較有意思的,是不是可以通過軟件開發來實現這個過程呢?古人云:“三人行,必有我師焉”,在面向對象的思維中,萬物皆對象,是對象我們就可以通過軟件設計來實現。首先對造人過程進行分析,該過程涉及三個對象:女媧、八卦爐、三種不同膚色的人。女媧可以使用場景類Client來表示,八卦爐類似于一個工廠,負責制造生產產品(即人類),三種不同膚色的人,他們都是同一個接口下的不同實現類,都是人嘛,只是膚色、語言不同,對于八卦爐來說都是它生產出的產品。分析完畢,我們就可以畫出如圖8-1所示的類圖。 類圖比較簡單,AbstractHumanFactory是一個抽象類,定義了一個八卦爐具有的整體功能,HumanFactory為實現類,完成具體的任務——創建人類;Human接口是人類的總稱,其三個實現類分別為三類人種;NvWa類是一個場景類,負責模擬這個場景,執行相關的任務。 我們定義的每個人種都有兩個方法:getColor(獲得人的皮膚顏色)和talk(交談),其源代碼如代碼清單8-1所示。 ![](https://box.kancloud.cn/2016-08-14_57b003605277f.jpg) 圖8-1 女媧造人類圖 代碼清單8-1 人類總稱 public?interface?Human?{ ?????//每個人種的皮膚都有相應的顏色 ?????public?void?getColor(); ?????//人類會說話 ?????public?void?talk(); } 接口Human是對人類的總稱,每個人種都至少具有兩個方法,黑色人種、黃色人種、白色人種的代碼分別如代碼清單8-2、代碼清單8-3、代碼清單8-4所示。 代碼清單8-2 黑色人種 public?class?BlackHuman?implements?Human?{ ?????public?void?getColor(){ ?????????????System.out.println("黑色人種的皮膚顏色是黑色的!"); ?????} ?????public?void?talk()?{ ?????????????System.out.println("黑人會說話,一般人聽不懂。"); ?????} } 代碼清單8-3 黃色人種 public?class?YellowHuman?implements?Human?{ ?????public?void?getColor(){ ?????????????System.out.println("黃色人種的皮膚顏色是黃色的!"); ?????} ?????public?void?talk()?{ ?????????????System.out.println("黃色人種會說話,一般說的都是雙字節。"); ?????} } 代碼清單8-4 白色人種 public?class?WhiteHuman?implements?Human?{ ?????public?void?getColor(){ ?????????????System.out.println("白色人種的皮膚顏色是白色的!"); ?????} ?????public?void?talk()?{ ?????????????System.out.println("白色人種會說話,一般都是但是單字節。"); ?????} } 所有的人種定義完畢,下一步就是定義一個八卦爐,然后燒制人類。我們想象一下,女媧最可能給八卦爐下達什么樣的生產命令呢?應該是“給我生產出一個黃色人種(YellowHuman類)”,而不會是“給我生產一個會走、會跑、會說話、皮膚是黃色的人種”,因為這樣的命令增加了交流的成本,作為一個生產的管理者,只要知道生產什么就可以了,而不需要事物的具體信息。通過分析,我們發現八卦爐生產人類的方法輸入參數類型應該是Human接口的實現類,這也解釋了為什么類圖上的AbstractHumanFactory抽象類中createHuman方法的參數為Class類型。其源代碼如代碼清單8-5所示。 代碼清單8-5 抽象人類創建工廠 public?abstract?class?AbstractHumanFactory?{ ?????public?abstract?<T?extends?Human>?T?createHuman(Class<T>?c); } 注意,我們在這里采用了泛型(Generic),通過定義泛型對createHuman的輸入參數產生兩層限制: ● 必須是Class類型; ● 必須是Human的實現類。 其中的"T"表示的是,只要實現了Human接口的類都可以作為參數,泛型是JDK 1.5中的一個非常重要的新特性,它減少了對象間的轉換,約束其輸入參數類型,對Collection集合下的實現類都可以定義泛型。有關泛型的詳細知識,請參考相關的Java語法文檔。 目前女媧只有一個八卦爐,其實現生產人類的方法,如代碼清單8-6所示。 代碼清單8-6 人類創建工廠 public?class?HumanFactory?extends?AbstractHumanFactory?{ ?????public?<T?extends?Human>?T?createHuman(Class<T>?c){ ?????????????//定義一個生產的人種 ?????????????Human?human=null; ?????????????try?{ ??????????????????????//產生一個人種 ??????????????????????human?=?(T)Class.forName(c.getName()).newInstance(); ?????????????}?catch?(Exception?e)?{ ??????????????????System.out.println("人種生成錯誤!"); ?????????????} ?????????????return?(T)human; ?????} } 人種有了,八卦爐也有了,剩下的工作就是女媧采集黃土,然后命令八卦爐開始生產,其過程如代碼清單8-7所示。 代碼清單8-7 女媧類 public?class?NvWa?{ ?????public?static?void?main(String[]?args)?{ ?????????????//聲明陰陽八卦爐 ?????????????AbstractHumanFactory?YinYangLu?=?new?HumanFactory();??????????????? ?????????????//女媧第一次造人,火候不足,于是白人產生了 ?????????????System.out.println("--造出的第一批人是白色人種--"); ?????????????Human?whiteHuman?=?YinYangLu.createHuman(WhiteHuman.class); ?????????????whiteHuman.getColor(); ?????????????whiteHuman.talk();????????? ?????????????//女媧第二次造人,火候過足,于是黑人產生了 ?????????????System.out.println("\n--造出的第二批人是黑色人種--"); ?????????????Human?blackHuman?=?YinYangLu.createHuman(BlackHuman.class); ?????????????blackHuman.getColor(); ?????????????blackHuman.talk();????????? ?????????????//第三次造人,火候剛剛好,于是黃色人種產生了 ?????????????System.out.println("\n--造出的第三批人是黃色人種--"); ?????????????Human?yellowHuman?=?YinYangLu.createHuman(YellowHuman.class); ?????????????yellowHuman.getColor(); ?????????????yellowHuman.talk(); ?????} } 人種有了,八卦爐有了,負責生產的女媧也有了,激動人心的時刻到來了,我們運行一下,結果如下所示。 --造出的第一批人是白色人種-- 白色人種的皮膚顏色是白色的! 白色人種會說話,一般都是單字節。 --造出的第二批人是黑色人種-- 黑色人種的皮膚顏色是黑色的! 黑人會說話,一般人聽不懂。 --造出的第三批人是黃色人種-- 黃色人種的皮膚顏色是黃色的! 黃色人種會說話,一般說的都是雙字節。 哇,人類的生產過程就展現出來了!這個世界就熱鬧起來了,黑人、白人、黃人都開始活動了,這也正是我們現在的真實世界。以上就是工廠方法模式(沒錯,對該部分有疑問,請繼續閱讀下去)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看