<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                第9章 抽象工廠模式 9.1 女媧的失誤 第8章講了女媧造人的故事。人是造出來了,世界也熱鬧了,可是低頭一看,都是清一色的類型,缺少關愛、仇恨、喜怒哀樂等情緒,人類的生命太平淡了,女媧一想,猛然一拍腦袋,忘記給人類定義性別了,那怎么辦?抹掉重來,于是人類經過一次大洗禮,所有的人種都消滅掉了,世界又是空無一物,寂靜而又寂寞。 由于女媧之前的準備工作花費了非常大的精力,比如準備黃土、八卦爐等,從頭開始建立所有的事物也是不可能的,那就想在現有的條件下重新造人,盡可能舊物利用嘛。人種(Product產品類)應該怎么改造呢?怎么才能讓人類有愛有恨呢?是神仙當然有辦法了,定義互斥的性別,然后在每個個體中埋下一顆種子:異性相吸,成熟后就一定會去找個異性(這就是我們說的愛情原動力)。從設計角度來看,一個具體的對象通過兩個坐標就可以確定:膚色和性別,如圖9-1所示。 ![](https://box.kancloud.cn/2016-08-14_57b00360dee64.jpg) 圖9-1 膚色性別坐標圖 產品類分析完畢了,生產的工廠類(八卦爐)該怎么改造呢?只有一個生產設備,要么生產出來的全都是男性,要么都是女性。那不行呀,這么翻天覆地的改造就是為了產生不同性別的人類。有辦法了!把目前已經有的生產設備——八卦爐拆開,于是女媧就使用了“八卦復制術”,把原先的八卦爐一個變兩個,并且略加修改,就成了女性八卦爐(只生產女性人種)和男性八卦爐(只生產男性人種),于是乎女媧就開始準備生產了,其類圖如圖9-2所示。 這個類圖雖然大,但是比較簡單。Java的典型類圖,一個接口,多個抽象類,然后是N個實現類,每個人種都是一個抽象類,性別是在各個實現類中實現的。特別需要說明的是HumanFactory接口,在這個接口中定義了三個方法,分別用來生產三個不同膚色的人種,也就是我們在圖9-1中的Y坐標,它的兩個實現類分別是性別,也就是圖9-1中的X坐標,通過X坐標(性別)和Y坐標(膚色)唯一確定了一個生產出來的對象。我們來看看相關的實現,Human接口如代碼清單9-1所示。 ![](https://box.kancloud.cn/2016-08-14_57b0036100889.jpg) 圖9-2 女媧重新生產人類 代碼清單9-1 人種接口 public?interface?Human?{ ?????//每個人種都有相應的顏色 ?????public?void?getColor(); ?????//人類會說話 ?????public?void?talk(); ?????//每個人都有性別 ?????public?void?getSex(); } 人種有三個抽象類,負責人種的抽象屬性定義:膚色和語言。白色人種、黑色人種、黃色人種分別如代碼清單9-2、代碼清單9-3、代碼清單9-4所示。 代碼清單9-2 白色人種 public?abstract?class?AbstractWhiteHuman?implements?Human?{ ?????//白色人種的皮膚顏色是白色的 ?????public?void?getColor(){ ?????????????System.out.println("白色人種的皮膚顏色是白色的!"); ?????} ?????//白色人種講話 ?????public?void?talk()?{ ?????????????System.out.println("白色人種會說話,一般說的都是單字節。"); ?????} } 代碼清單9-3 黑色人種 public?abstract?class?AbstractBlackHuman?implements?Human?{ ?????public?void?getColor(){ ?????????????System.out.println("黑色人種的皮膚顏色是黑色的!"); ?????} ?????public?void?talk()?{ ?????????????System.out.println("黑人會說話,一般人聽不懂。"); ?????} } 代碼清單9-4 黃色人種 public?abstract?class?AbstractYellowHuman?implements?Human?{ ?????public?void?getColor(){ ?????????????System.out.println("黃色人種的皮膚顏色是黃色的!"); ?????} ?????public?void?talk()?{ ?????????????System.out.println("黃色人種會說話,一般說的都是雙字節。"); ?????} } 每個抽象類都有兩個實現類,分別實現公共的最細節、最具體的事物:膚色和語言。具體的實現類實現膚色、性別定義,以黃色女性人種為例,如代碼清單9-5所示。 代碼清單9-5 黃色女性人種 public?class?FemaleYellowHuman?extends?AbstractYellowHuman?{ ?????//黃人女性 ?????public?void?getSex()?{ ?????????????System.out.println("黃人女性"); ?????} } 黃色男性人種如代碼清單9-6所示。 代碼清單9-6 黃色男性人種 public?class?MaleYellowHuman?extends?AbstractYellowHuman?{ ?????//黃人男性 ?????public?void?getSex()?{ ?????????????System.out.println("黃人男性"); ?????} } 其他的黑色人種、白色人種的男性和女性的代碼與此類似,不再重復編寫。到此為止,我們已經把真實世界的人種都定義出來了,剩下的工作就是怎么制造人類。接口HumanFactory如代碼清單9-7所示。 代碼清單9-7 八卦爐定義 public?interface?HumanFactory?{ ?????//制造一個黃色人種 ?????public?Human?createYellowHuman(); ?????//制造一個白色人種 ?????public?Human?createWhiteHuman(); ?????//制造一個黑色人種 ?????public?Human?createBlackHuman(); } 在接口中,我們看到八卦爐是可以生產出不同膚色人種的(當然了,女媧的失誤嘛),那它有多少個八卦爐呢?兩個,分別生產女性和男性,女性和男性八卦爐分別如代碼清單9-8和代碼清單9-9所示。 代碼清單9-8 生產女性的八卦爐 public?class?FemaleFactory?implements?HumanFactory?{ ?????//生產出黑人女性 ?????public?Human?createBlackHuman()?{ ?????????????return?new?FemaleBlackHuman(); ?????} ?????//生產出白人女性 ?????public?Human?createWhiteHuman()?{?? ?????????????return?new?FemaleWhiteHuman(); ?????} ?????//生產出黃人女性 ?????public?Human?createYellowHuman()?{ ?????????????return?new?FemaleYellowHuman(); ?????} } 代碼清單9-9 生產男性的八卦爐 public?class?MaleFactory?implements?HumanFactory?{ ?????//生產出黑人男性 ?????public?Human?createBlackHuman()?{ ?????????????return?new?MaleBlackHuman(); ?????} ?????//生產出白人男性 ?????public?Human?createWhiteHuman()?{?? ?????????????return?new?MaleWhiteHuman(); ?????} ?????//生產出黃人男性 ?????public?Human?createYellowHuman()?{ ?????????????return?new?MaleYellowHuman(); ?????} } 人種有了,八卦爐也有了,我們就來重現一下當年女媧造人的光景,如代碼清單9-10所示。 代碼清單9-10 女媧重造人類 public?class?NvWa?{ ?????public?static?void?main(String[]?args)?{??????????? ?????????????//第一條生產線,男性生產線 ?????????????HumanFactory?maleHumanFactory?=?new?MaleFactory();????????? ?????????????//第二條生產線,女性生產線 ?????????????HumanFactory?femaleHumanFactory?=?new?FemaleFactory();????????????? ?????????????//生產線建立完畢,開始生產人了: ?????????????Human?maleYellowHuman?=?maleHumanFactory.createYellowHuman();?????????????? ?????????????Human?femaleYellowHuman?=?femaleHumanFactory.createYellowHuman();?? ?????????????System.out.println("---生產一個黃色女性---"); ?????????????femaleYellowHuman.getColor(); ?????????????femaleYellowHuman.talk(); ?????????????femaleYellowHuman.getSex();???????????????? ?????????????System.out.println("\n---生產一個黃色男性---"); ?????????????maleYellowHuman.getColor(); ?????????????maleYellowHuman.talk(); ?????????????maleYellowHuman.getSex();?????????? ?????????????/* ??????????????*?...... ??????????????*?后面繼續創建 ??????????????*/ ?????} } 運行結果如下所示: ---生產一個黃色女性--- 黃色人種的皮膚顏色是黃色的! 黃色人種會說話,一般說的都是雙字節。 黃人女性 ---生產一個黃色男性--- 黃色人種的皮膚顏色是黃色的! 黃色人種會說話,一般說的都是雙字節。 黃人男性 各種膚色的男性、女性都制造出來了,兩性之間產生了相互吸引力,于是情感產生,這個世界就多了一種小說的題材“愛情”。回頭來想想我們的設計,不知道大家有沒有去過工廠,每個工廠分很多車間,每個車間又分多條生產線,分別生產不同的產品,我們可以把八卦爐比喻為車間,把八卦爐生產的工藝(生產白人、黑人還是黃人)稱為生產線,如此來看就是一個女性生產車間,專門生產各種膚色的女性,一個是男性生產車間,專門生產各種膚色男性,生產完畢就可以在系統外組裝,什么是組裝?嘿嘿,自己思考!在這樣的設計下,各個車間和各條生產線的職責非常明確,在車間內各個生產出來的產品可以有耦合關系,你要知道世界上黑、黃、白人種的比例是:1∶4∶6,那這就需要女媧娘娘在燒制的時候就要做好比例分配,在一個車間內協調好。這就是抽象工廠模式。
                  <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>

                              哎呀哎呀视频在线观看