設計模式中的簡單工廠、工廠模式、抽象工廠模式總是分不清?一文告訴你所有區別
簡單工廠
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小時內刪除侵權內容。