設計模式:簡單工廠模式編程
簡單工廠模式是由工廠對象決定建立出哪一種產品類的實例。封裝好建立邏輯用來建立對象(用途)。設計模式
簡單工廠模式的結構圖:分佈式
從圖中能夠看出,簡單工廠模式涉及到工廠角色,抽象產品角色以及具體產品角色等三個角色:spa
工廠類(Factory)角色:擔任這個角色的是工廠方法模式的核心,含有與應用緊密相關的商業邏輯。設計
抽象產品(Product)角色:擔任這個角色的類是所建立的對象的父類,或它們共同擁有的接口,這裏指的就是Pizza這個類。3d
具體產品(Concrete Product)角色:所建立的任務對象都是這個角色的實例,這裏指GreekPizza和CheesePizza。 對象
簡單工廠模式的優勢:對責任的分割blog
模式的核心是工廠類。這個類含有必要的判斷邏輯,封裝好建立邏輯,能夠決定建立哪一個產品類的實例。而客戶端則能夠免除直接建立對象的責任,傳入參數便可。簡單工廠模式經過這種作法實現了對責任的分割。繼承
簡單工廠模式的缺點:不易於擴展過於複雜的產品結構接口
這個工廠類集中了全部的建立邏輯,當有複雜的多層次等級結構時,全部的業務邏輯都在這個工廠類中實現。何時它不能工做了,整個系統都會受到影響。而且簡單工廠模式違背了開閉原則(對擴展的開放,對修改的關閉)。
在如下狀況下能夠考慮使用簡單工廠模式:
一、工廠類負責建立的對象(種類,個數無窮多)比較少,因爲建立的對象較少,不會形成工廠方法中的業務邏輯太過複雜。
二、客戶端只知道傳入工廠類的參數,對於如何建立對象並不關心。
理解 :熟記結構圖,用途,三個角色的意義
簡單工廠中的反射獲取須要建立哪一個類(客戶端只需傳入參數)
客戶端傳入參數,建立工廠用父類接收,存在繼承重寫因此record用子類方法
設計模式:工廠方法模式
工廠方法模式的用意是定義一個建立產品對象的工廠接口,讓實現這個接口的類來決定實例化哪一個類(工廠方法讓類的實例化推遲到子類中進行)。
從上圖能夠看出, 工廠方法模式涉及到抽象工廠角色,具體工廠角色,抽象產品角色以及具體產品角 色等四個角色:
抽象工廠角色:擔任這個角色的是工廠方法模式的核心,它是與應用程序無關的。任何在模式中建立對象的工廠類必須實現這個接口。
具體工廠角色:擔任這個角色的是實現了抽象工廠接口的具體Java類,具體工廠角色含有與應用密切相關的邏輯,而且受到應用程序的調用以建立產品對象。
抽象產品角色:工廠方法模式所建立的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。
具體產品角色:這個角色實現了抽象產品角色所申明的接口。工廠方法模式所建立的每個對象都是某個具體產品角色的實例。
工廠方法模式和簡單工廠模式比較:
工廠方法模式跟簡單工廠模式在結構上的不一樣是很明顯的,工廠方法模式的核心是一個抽象工廠類,而簡單工廠模式的核心在一個具體類。顯而易見工廠方法模式這種結構更好擴展,權力下發,分佈式比集中式更具優點。若是系統須要加入一個新的產品(產品族擴大,增長了產品類),那麼所須要的就是向系統中加入一個這個產品類以及它所對應的工廠類。沒有必要修改客戶端,也沒有必要修改抽象工廠角色或者其餘已有的具體工廠角色。對於增長新的產品類而言,這個系統徹底支持開閉原則。
優勢:用戶只需關心所需產品對應的工廠,無須關心建立細節。加入新產品符合開閉原則,提升了系統的可擴展性。
缺點:類的個數容易過多,增長了代碼結構的複雜度。增長了系統的抽象性和理解難度。
適用場景:
建立對象須要大量重複的代碼。
客戶端(應用層)不依賴於產品類實例如何被建立、實現等細節。 一個類經過其子類來指定建立哪一個對象。
總結:熟記結構圖,四個角色,擴展只需加入產品類和工廠類。
設計模式:抽象工廠模式
抽象工廠模式是全部形態的工廠模式中最爲抽象和最具通常性的一種形態。抽象工廠模式能夠向客戶端提供一個接口,使得客戶端在沒必要指定產品的具體類型的狀況下,建立多個產品族中的產品對象。(優勢)
抽象工廠模式的簡略類圖以下:
從上圖能夠看出, 抽象工廠模式涉及到抽象工廠角色,具體工廠角色,抽象產品角色以及具體產品角 色等四個角色:
抽象工廠角色:擔任這個角色的是工廠方法模式的核心,它是與應用程序無關的。任何在模式中建立對象的工廠類必須實現這個接口。
具體工廠角色:擔任這個角色的是實現了抽象工廠接口的具體Java類,具體工廠角色含有與應用密切相關的邏輯,而且受到應用程序的調用以建立產品對象。
抽象產品角色:工廠方法模式所建立的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。
具體產品角色:這個角色實現了抽象產品角色所申明的接口。工廠方法模式所建立的每個對象都是某個具體產品角色的實例。
工廠方法模式和抽象工廠模式對比
工廠方法模式是一種極端狀況的抽象工廠模式,而抽象工廠模式能夠當作是工廠方法模式的推廣。工廠方法模式用來建立一個產品的等級結構,而抽象工廠模式是用來建立多個產品的等級結構。工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個抽象產品類。 工廠方法模式中具體工廠類只有一個建立方法,而抽象工廠模式中具體工廠類有多個建立方法。
缺點:(設計之初)規定了全部可能被建立的產品集合,產品族中擴展新的產品困難,須要修改抽象工廠的接口。增長了系統的抽象性和理解難度。
優勢:具體產品在應用層代碼隔離,無須關心建立細節將一個系列的產品族統一到一塊兒建立。
適用場景:
客戶端(應用層)不依賴於產品類實例如何被建立、實現等細節。 強調一系列相關的產品對象(屬於同一產品族)一塊兒使用建立對 象須要大量重複的代碼。提供一個產品類的庫,全部的產品以一樣的接口出現,從而使客 戶端不依賴於具體實現。
總結:
系統能夠在不修改具體工廠角色的狀況下引進新的產品。客戶端沒必要關心對象如何建立,明確了職責。更好的理解面向對象的原則,面向接口編程,而不要面向實現編程。