設計模式中的簡單工廠、工廠模式、抽象工廠模式總是分不清?一文告訴你所有區別

      網友投稿 916 2022-05-29

      簡單工廠

      Q: 簡單工廠模式是什么?

      A:

      簡單工廠模式不是23種設計模式里的一種,簡而言之,就是有一個專門生產某個產品的類。

      比如下圖中的鼠標工廠,專業生產鼠標,給參數0,生產戴爾鼠標,給參數1,生產惠普鼠標。

      注意這個參數, 我必須根據入參去確定返回

      factory.create(int type)

      Q: 簡單工廠模式的缺點是什么?

      A:

      當我試圖新增一種類型, 我就得在create里新增case-when, 外面也要做類型的適配

      但是由于工廠類集中了所有實例的創建邏輯,違反了高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類中;它所能創建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利;

      工廠方法模式

      Q: 工廠方法模式是什么?

      A: 把創建對象的操作集中到工廠方法中,工廠支持繼承。

      外界不關注內部怎么生成或者生成什么, 只要給了對應的工廠,返回給我正確的產品基類即可。

      舉例:

      有1個父類模式

      工廠接口A , 和 產品接口B

      從接口上可以看出, 接口A.create()函數生產出產品B,

      然后后面類似工廠->生產->產品的情況, 都繼承過來

      工廠類C繼承接口A, 產品類D繼承接口B。

      于是工廠就有好多個了

      當我試圖切換產品,只需要切換工廠即可,不再需要給出方法入參了!

      **

      Q: 和簡單工廠相比,優點是什么?

      A:

      設計模式中的簡單工廠、工廠模式、抽象工廠模式總是分不清?一文告訴你所有區別

      一個調用者想創建一個對象,只要知道其名稱就可以了。

      擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以。

      屏蔽產品的具體實現,調用者只關心產品的接口。(調用者不用想著我傳啥參數了,是1還是2還是什么枚舉,直接拿到這個工廠create就完事)

      Q: 工廠方法的缺點是什么?

      A:

      每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴。這并不是什么好事。

      注意: 這里的工廠方法,一般只有一個create()方法,沒有其他的了, 所以模式名特地指出了”方法“二字

      抽象工廠模式

      Q: 抽象工廠是什么?

      A:

      抽象工廠模式是工廠方法模式的升級版本,他用來創建一組相關或者相互依賴的對象。他與工廠方法模式的區別就在于 抽象工廠方法里的create有好幾個,是一個產品族

      Q: 抽象工廠相比工廠方法模式的改進?

      A:

      工廠方法模式只有1種create, 當你要新增一類產品的時候, 得重新設計工廠接口類。

      而抽象工廠中, 直接工廠接口類上新增方法, 后面的子類同一實現即可。

      新增接口方法, 不需要再新增接口類

      因此這個工廠更像一個有很多能力的大工廠了, 不再是一個簡單的create()了

      抽象工廠模式隔離了具體類的生成,使得客戶并不需要知道什么被創建。由于這種隔離,更換一個具體工廠就變得相對容易,所有的具體工廠都實現了抽象工廠中定義的那些公共接口,因此只需改變具體工廠的實例,就可以在某種程度上改變整個軟件系統的行為。

      當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象。

      增加新的產品族很方便,無須修改已有系統,符合“開閉原則”。

      Q: 抽象工廠的缺點?

      A:

      增加新的產品等級結構麻煩,需要對原有系統進行較大的修改,甚至需要修改抽象層代碼,這顯然會帶來較大的不便,違背了“開閉原則”。

      Q: 那工廠方法模式和抽象工廠模式的應用在哪呢??

      A:

      我們最常用的 Spring 就是一個最大的 Bean 工廠,IOC 通過FactoryBean對Bean 進行管理。

      我們使用的日志門面框架slf4j,點進去就可以看到熟悉的味道 private final static Logger logger = LoggerFactory.getLogger(HelloWord.class);

      而這里的工廠實現,通過類加載去獲取,應用開發者根本不需要關心背后實現是什么。 項目維護人員維護好日志jar包和配置即可。

      JDK 的 Calendar 使用了簡單工廠模式Calendar calendar = Calendar.getInstance();

      日志記錄器:記錄可能記錄到本地硬盤、系統事件、遠程服務器等,用戶可以選擇記錄日志到什么地方。

      數據庫訪問,當用戶不知道最后系統采用哪一類數據庫,以及數據庫可能有變化時。設計一個連接服務器的框架,需要三個協議,“POP3”、“IMAP”、“HTTP”,可以把這三個作為產品類,共同實現一個接口。

      比如 Hibernate 換數據庫只需換方言和驅動就可以

      EI企業智能 Java 云設計 可信智能計算服務 TICS 智能數據

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Java基礎之常用類
      下一篇:全面自主國產化生態—記華為HC2019大會
      相關文章
      亚洲伦理一区二区| 18禁亚洲深夜福利人口| 亚洲人成网站色7799| 亚洲国产中文在线视频| 亚洲一区免费观看| 亚洲一区二区影院| 亚洲欧美黑人猛交群| 亚洲精品午夜视频| 亚洲网站在线播放| 91亚洲一区二区在线观看不卡| 图图资源网亚洲综合网站| 亚洲AV无码成人网站久久精品大 | 亚洲人成网站18禁止一区| 久久精品国产亚洲av瑜伽| 爱情岛论坛亚洲品质自拍视频网站 | 亚洲一级毛片免观看| 亚洲91精品麻豆国产系列在线| 亚洲小视频在线播放| 亚洲成人免费网站| 色偷偷亚洲女人天堂观看欧| 亚洲综合av一区二区三区| 亚洲精品伦理熟女国产一区二区| 亚洲1区2区3区精华液| 国产亚洲精品国产福利在线观看 | 国产大陆亚洲精品国产| 亚洲成a人一区二区三区| 亚洲日本va午夜中文字幕久久| 亚洲综合色视频在线观看| 亚洲真人无码永久在线| 亚洲AV中文无码字幕色三| 亚洲爱情岛论坛永久| 亚洲精品日韩中文字幕久久久| 亚洲制服丝袜精品久久| 亚洲综合激情五月色一区| 亚洲第一成年网站视频| 亚洲狠狠爱综合影院婷婷| 亚洲日本一区二区三区在线 | 亚洲av日韩专区在线观看| 亚洲成av人片在线观看天堂无码 | 亚洲午夜久久久精品电影院| 中文字幕在线日亚洲9|