工廠方法和抽象工廠區別

簡單工廠:簡單工廠沒有抽象類,只有一個具體工廠類如MyFactory,MyFactory裏面有個工廠方法CreateProduct返回一個基類產品,具體返回什麼實例通過傳入參數判斷。



用手機生產做個例子:

比如Nokia簡單工廠就是隻有NokiaFactory工廠類,工廠方法就是CreateNokiaPhone,參數是Nokia手機型號,根據不同型號創建不同的Nokia手機。明顯的缺點是Nokia每發明一個新型號的手機都需要修改簡單工廠類,違反了封閉修改,開放擴展原則。

工廠方法:該模式有一個抽象基類和若干個派生的具體工廠類,基類定義了一個虛工廠方法返回指定產品類的基類,派生類需要實現該虛方法並創建具體產品類返回。注意工廠方法的每個具體工廠只負責返回一種產品類。




同樣以手機生產做例子:

Nokia工廠方法模式有一個工廠基類NokiaFactory,注意此工廠和上面不一樣,是抽象的。該類定義一個虛工廠方法CreateNokiaPhone,該方法返回NokiaPhone基類。然後不同型號的手機對應一個該型號的手機工廠,比如N97Factory,注意此工廠派生於NokiaFactory基類,N97Factory實現虛工廠方法,它返回值是具體的Nokia手機類,如new N97Phone。(注意N97Phone是NokiaPhone的派生類)這樣的優點就是,新出一個Nokia手機型號,只需派生一個該型號的工廠而無需修改原來的代碼。符合封閉修改,開放擴展原則。

抽象工廠:該模式和工廠方法模式很相似,也是一個抽象基類和若干個具體工廠類,不同的是抽象工廠的工廠基類定義了多個虛工廠方法,每個虛工廠方法負責返回一種產品,多個工廠方法返回多種產品,並且這些產品具有某些聯繫。

抽象工廠就不止生產Nokia手機了,還生產相關的周邊產品,首先NokiaFactory基類會定義兩個虛方法,一個是CreateNokiaPhone用來生產手機,另一個是CreateNokiaCharger用於生產對應型號的手機充電器(假定不同型號手機使用不同的充電器)。然後派生類N97Factory就要生產兩種相關的產品,一個是N97Phone,還有一個是N97Charger,這兩個對象是對應的關係,因此封裝到抽象工廠來生產一系列相關的對象。



總結:用最簡單的話來概括就是,簡單工廠只有一個具體工廠類來創建一種基類的多個不同派生類,工廠方法就是有多個派生於一個基類的具體工廠類,每個具體工廠只生產一種基類的一個派生類,抽象工廠也是隻有一個工廠基類,但是每個具體工廠生產多個相關基類的各一個派生類。

工廠方法模式:
    一個抽象產品類,可以派生出多個具體產品類。
    一個抽象工廠類,可以派生出多個具體工廠類。
    每個具體工廠類只能創建一個具體產品類的實例。
抽象工廠模式:
    多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
    一個抽象工廠類,可以派生出多個具體工廠類。
    每個具體工廠類可以創建多個具體產品類的實例。

區別:
    工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。
    工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。

參考資料:

簡單工廠,工廠方法和抽象工廠的區別總結
工廠方法模式與抽象工廠模式的區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章