<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          漫畫:設(shè)計模式之 “工廠模式”

          共 2753字,需瀏覽 6分鐘

           ·

          2020-09-10 20:34



          —————? 第二天? —————



          ————————————


          ClassA?a?=?new?ClassA();
          ClassB?b?=?new?ClassB();




          假設(shè)我們的業(yè)務(wù)代碼當(dāng)中,有一個被廣泛引用的“口罩類”,這個類實例需要在許多地方被創(chuàng)建和初始化,而初始化的代碼也比較復(fù)雜。


          public?class?Mask?{
          ????//構(gòu)造函數(shù)
          ????public?Mask(){
          ????????//?.....
          ????????//?100行初始化代碼
          ????}
          }


          針對這種情況,我們可以構(gòu)建一個“口罩工廠”專門負(fù)責(zé)創(chuàng)建口罩對象,把口罩的初始化代碼遷移到工廠類的創(chuàng)建方法當(dāng)中:


          public?class?MaskFactory?{

          ????public?Mask?createMask()?{
          ????????Mask?mask?=?new?Mask();
          ????????//?.....
          ????????//?100行初始化代碼
          ????????return?mask;
          ????}
          }


          假設(shè)口罩類只是一個抽象接口,有兩個子類“高端口罩”和“低端口罩”分別實現(xiàn)了這個接口:


          public?interface?IMask?{
          ????void?show();
          }

          public?class?HighEndMask?implements?IMask?{
          ????@Override
          ????public?void?show()?{
          ????????System.out.println("我是高端口罩");
          ????}
          }

          public?class?LowEndMask?implements?IMask?{
          ????@Override
          ????public?void?show(){
          ????????System.out.println("我的低端口罩");
          ????}

          }


          那么口罩工廠該如何創(chuàng)建這兩種類型的口罩呢?


          很簡單,在創(chuàng)建方法中傳入?yún)?shù)(這里的參數(shù)是type),根據(jù)參數(shù)來做條件判斷,決定創(chuàng)建什么樣的口罩:


          public?class?MaskFactory{

          ????public?IMask?createMask(String?type)?{
          ????????IMask?mask?=?null;
          ????????if("高端口罩".equals(type)){
          ????????????mask?=?new?HighEndMask();
          ????????????//?.....
          ????????????// HighEndMask的100行初始化代碼
          ????????}else?if("低端口罩".equals(type)){
          ????????????mask?=??new?LowEndMask();
          ????????????//?.....
          ????????????// LowEndMask的100行初始化代碼
          ????????}
          ????????return?mask;
          ????}
          }


          在客戶端,想要創(chuàng)建什么樣的口罩對象,只需傳入對應(yīng)的類型名稱:


          public?class?Test?{

          ????public?static?void?main(String[]?args)?{
          ????????MaskFactory?factory?=?new?MaskFactory();
          ????????IMask?maskA?=?factory.createMask("高端口罩");
          ????????IMask?maskB?=?factory.createMask("低端口罩");
          ????????maskA.show();
          ????????maskB.show();
          ????}
          }




          (注:所謂面向?qū)ο蟮拈_放-封閉原則,就是在程序中對“擴展”開放,對“修改”封閉。如果每次業(yè)務(wù)改動都要增加新的if-else,就涉及對舊有代碼的修改,不但容易出錯,可讀性也不好。)




          讓我們根據(jù)這個思路,重構(gòu)一下工廠類的邏輯:


          public?interface?IMaskFactory?{
          ????IMask?createMask();
          }

          public?class?HighEndFactory?implements?IMaskFactory{

          ????@Override
          ????public?IMask?createMask()?{
          ????????IMask?mask?=??new?HighEndMask();
          ????????//?.....
          ????????// HighEndMask的100行初始化代碼
          ????????return?mask;
          ????}
          }

          public?class?LowEndFactory?implements?IMaskFactory{

          ????@Override
          ????public?IMask?createMask()?{
          ????????IMask?mask?=??new?LowEndMask();
          ????????//?.....
          ????????//? LowEndMask的100行初始化代碼
          ????????return?mask;
          ????}
          }


          在代碼中,工廠類變成了抽象的接口,高端口罩工廠和低端口罩工廠這兩個子類分別實現(xiàn)了該接口。


          在客戶端,想要創(chuàng)建什么樣的口罩對象,只需實例化不同的工廠子類,調(diào)用相同的創(chuàng)建方法,無需再傳入?yún)?shù):


          public?class?Test?{

          ????public?static?void?main(String[]?args)?{
          ????????IMaskFactory?factoryA?=?new?LowEndFactory();
          ????????IMaskFactory?factoryB?=?new?HighEndFactory();
          ????????IMask?maskA?=?factoryA.createMask();
          ????????IMask?maskB?=?factoryB.createMask();
          ????????maskA.show();
          ????????maskB.show();
          ????}
          }





          推薦閱讀:

          完全整理 | 365篇高質(zhì)技術(shù)文章目錄整理

          算法之美 : 棧和隊列

          主宰這個世界的10大算法

          徹底理解cookie、session、token

          淺談什么是遞歸算法

          專注服務(wù)器后臺技術(shù)棧知識總結(jié)分享

          歡迎關(guān)注交流共同進步

          碼農(nóng)有道?coding


          碼農(nóng)有道,為您提供通俗易懂的技術(shù)文章,讓技術(shù)變的更簡單

          嘿,你在看嗎
          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲日韩发布在线免费 | 人成视频在线观看一区二区 | 成人三级片av | 思思热在线视频精品 | 婷婷五月天基地 |