抽象工廠模式:為建立一組相關或相互依賴的物件提供一個介面,而且無需指定它們的具體類。
抽象工廠模式是工廠方法模式的升級版本,在有多個業務品種、業務分類時,透過抽象工廠模式產生需要的物件是一種非常好的解決方式。
優點:
缺點:
抽象工廠模式的最大缺點就是產品族擴充套件非常困難,我們以通用程式碼為例,如果要增加一個產品C,也就是說產品家族由原來的2個增加到3個,看看我們的程式有多大改動吧!抽象類要增加一個方法,然後兩個實現類都要修改,想想看,這嚴重違反了開閉原則,而且我們一直說明抽象類和介面是一個契約。改變契約,所有與契約有關係的程式碼都要修改,那麼這段程式碼叫什麼?叫“有毒程式碼”,——只要與這段程式碼有關係,就可能產生侵害的危險!
使用場景
抽象工廠模式的使用場景定義非常簡單:一個物件族後是一組沒有任何關係的物件都有相同的約束,則可以使用抽象工廠模式。什麼意思呢?例如一個文字編輯器和一個圖片處理器,大都是軟體實體,但是*nix下的文字編輯器和Windows下的文字編輯器雖然功能和介面都相同,但是程式碼實現是不同的,圖片處理器也有類似情況。也就是具有了共同的約束條件:作業系統型別。於是我們可以使用抽象工廠模式,產生不同作業系統下的編輯器和圖片處理器。
注意事項
在抽象工廠模式的缺點中,我們提到抽象工廠模式的產品族擴充套件比較困難,但是一定要清楚,是產品族擴充套件困難,而不是產品等級。在該模式下,產品等級是非常容易擴充套件的,增加一個產品等級,只要增加一個工廠類負責新增加出來的產品生產任務即可。也就是說橫向擴充套件容易,縱向擴充套件難。
抽象工廠模式:為建立一組相關或相互依賴的物件提供一個介面,而且無需指定它們的具體類。
抽象工廠模式是工廠方法模式的升級版本,在有多個業務品種、業務分類時,透過抽象工廠模式產生需要的物件是一種非常好的解決方式。
優點:
封裝性,每個產品的實現不是高層模組要關心的,它要關心的是介面,是抽象,它不關心物件是如何創建出來的,這是由工廠類負責的,只要知道工廠類是誰,我就能創建出一個需要的物件,省時省力,優秀設計就應該如此。產品族內的約束為非公開狀態。缺點:
抽象工廠模式的最大缺點就是產品族擴充套件非常困難,我們以通用程式碼為例,如果要增加一個產品C,也就是說產品家族由原來的2個增加到3個,看看我們的程式有多大改動吧!抽象類要增加一個方法,然後兩個實現類都要修改,想想看,這嚴重違反了開閉原則,而且我們一直說明抽象類和介面是一個契約。改變契約,所有與契約有關係的程式碼都要修改,那麼這段程式碼叫什麼?叫“有毒程式碼”,——只要與這段程式碼有關係,就可能產生侵害的危險!
使用場景
抽象工廠模式的使用場景定義非常簡單:一個物件族後是一組沒有任何關係的物件都有相同的約束,則可以使用抽象工廠模式。什麼意思呢?例如一個文字編輯器和一個圖片處理器,大都是軟體實體,但是*nix下的文字編輯器和Windows下的文字編輯器雖然功能和介面都相同,但是程式碼實現是不同的,圖片處理器也有類似情況。也就是具有了共同的約束條件:作業系統型別。於是我們可以使用抽象工廠模式,產生不同作業系統下的編輯器和圖片處理器。
注意事項
在抽象工廠模式的缺點中,我們提到抽象工廠模式的產品族擴充套件比較困難,但是一定要清楚,是產品族擴充套件困難,而不是產品等級。在該模式下,產品等級是非常容易擴充套件的,增加一個產品等級,只要增加一個工廠類負責新增加出來的產品生產任務即可。也就是說橫向擴充套件容易,縱向擴充套件難。