簡單的工廠模式
基本定義
- 先定義了一個類, 這個類
專門
用于創(chuàng)建其他類的實(shí)例, 被創(chuàng)建的類都有一個共同特點(diǎn),相同的父類
- 工廠模式屬于
創(chuàng)建型
模式 - 可以根據(jù)創(chuàng)建時傳入?yún)?shù)的不同, 返回不同實(shí)例對象, 也可以單獨(dú)定義
不帶參數(shù)
的方法創(chuàng)建指定的實(shí)例對象
模式結(jié)構(gòu)
- Product: 抽象產(chǎn)品角色 ==> 為所有產(chǎn)品的父類
- ConcreteProductA:具體的產(chǎn)品角色 ==> 繼承Product
- ConcreteProductB:具體的產(chǎn)品角色 ==> 繼承Product
- Factory: 工廠角色 ==> 專門用于創(chuàng)建實(shí)例類
特點(diǎn)
- 實(shí)例具有共同的父類
- 核心就是繼承. 子類繼承父類并重寫
代碼實(shí)現(xiàn)
-
這里, 一個車父類, 兩個車類, 一個工廠
優(yōu)點(diǎn)
- 實(shí)現(xiàn)了對責(zé)任的分隔,提供了專門類創(chuàng)建對象
- 通過配置文件方式轧粟,可以在不修改代碼情況下, 擴(kuò)展新產(chǎn)品脓魏,在一定程序上提高了系統(tǒng)的靈活性。
缺點(diǎn)
-
工廠類
集中了所以產(chǎn)品創(chuàng)建邏輯揽祥,一旦不能正常工作檩电,整個系統(tǒng)受影響 - 類個數(shù)爆增,在一定程度上增加了系統(tǒng)的復(fù)雜度和理解
- 系統(tǒng)擴(kuò)展困難料按,一旦添加了新產(chǎn)品就不得不修改工廠邏輯载矿,在產(chǎn)品類型較多時,有可能造成工廠邏輯過于復(fù)雜弯洗,不利于系統(tǒng)的擴(kuò)展和維護(hù)
- 工廠集中了所有邏輯, 后期擴(kuò)展困難逢勾。產(chǎn)品類符合開閉原則,但是工廠違反了逃贝,因?yàn)樵黾右粋€產(chǎn)品迫摔,工廠需要修改邏輯, 耦合太高。
總結(jié)
簡單工廠模式的要點(diǎn)就在于當(dāng)你需要什么沪摄,只需要知道正確參數(shù)纱烘,就可以獲取你所需要的對象凹炸,無需知道其創(chuàng)建細(xì)節(jié)昼弟。
簡單工廠模式最大的優(yōu)點(diǎn)在于實(shí)現(xiàn)對象的創(chuàng)建和對象的分離舱痘,但是如果產(chǎn)品過多時,會導(dǎo)致工廠代碼復(fù)雜芭逝。
正常的工廠模式
基本定義
- 工廠方法模式定義了一個創(chuàng)建對象的接口旬盯,但由子類決定要實(shí)例化的類是哪一個翎猛。工廠方法模式讓實(shí)例化推遲到子類接剩。
模式結(jié)構(gòu)
- product: 抽象產(chǎn)品懊缺。所有的產(chǎn)品必須實(shí)現(xiàn)這個共同的接口,這樣一來遗座,使用這些產(chǎn)品的類既可以引用這個接口俊扳。
- ConcreteProduct:具體產(chǎn)品。
- Creator:抽象工廠碎绎。它實(shí)現(xiàn)了所有操縱產(chǎn)品的方法筋帖,但不實(shí)現(xiàn)工廠方法冤馏。Creator所有的子類都必須要實(shí)現(xiàn)factoryMethod()方法。
- ConcreteCreator:具體工廠代箭。制造產(chǎn)品的實(shí)際工廠涕刚。它負(fù)責(zé)創(chuàng)建一個或者多個具體產(chǎn)品
代碼實(shí)現(xiàn)
特點(diǎn)
- 比簡單工廠多了一個工廠的抽象類
抽象工廠模式
特點(diǎn)
利用OOP的多態(tài)性杜漠,
工廠
和產(chǎn)品
都抽出一個基類驾茴,一個工廠對一個系列
產(chǎn)品產(chǎn)品過多的時候, 比如有100個車型, 如果用工廠方式, 創(chuàng)建100個工廠一一對應(yīng), 類太多太惡心, 從而引出抽象工廠概念, 工廠不在對應(yīng)一種產(chǎn)品, 工廠可以分類, 可以分為日系汽車工廠, 德系汽車工廠, 美系汽車工廠, 減少了工廠的創(chuàng)建
模式結(jié)構(gòu)
- AbstractFactory:抽象工廠。抽象工廠定義了一個接口晨缴,所有的具體工廠都必須實(shí)現(xiàn)此接口峡捡,這個接口包含了一組方法用來生產(chǎn)產(chǎn)品。
- ConcreteFactory:具體工廠延都。具體工廠是用于生產(chǎn)不同產(chǎn)品族晰房。要創(chuàng)建一個產(chǎn)品,客戶只需要使用其中一個工廠完全不需要實(shí)例化任何產(chǎn)品對象与境。
- AbstractProduct:抽象產(chǎn)品猖吴。這是一個產(chǎn)品家族,每一個具體工廠都能夠生產(chǎn)一整組產(chǎn)品共屈。
- Product:具體產(chǎn)品党窜。
代碼創(chuàng)建
其他
- 開閉原則:一個軟件實(shí)體(如類幌衣、模塊豁护、函數(shù))對擴(kuò)展開放,對修改關(guān)閉断部。`