设计模式之工厂模式和抽象工厂
設計模式分類
通常來說設計模式分為三大類:
- 創建型模式,共 5 種:工廠模式、抽象工廠模式、單例模式、建造者模式、原型模式。
- 結構型模式,共 7 種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
- 行為型模式,共 11 種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
下面用圖片來整體描述一下設計模式之間的關系:
工廠模式
工廠模式(Factory Pattern)的意義就跟它的名字一樣,在面向對象程序設計中,工廠通常是一個用來創建其他對象的對象。工廠模式根據不同的參數來實現不同的分配方案和創建對象。
在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,并且是通過使用一個共同的接口來指向新創建的對象。例如用工廠來創建 人 這個對象,如果我們需要一個男人對象,工廠就會為我們創建一個男人;如果我們需要一個女人,工廠就會為我們生產一個女人。
工廠模式通常分為:
- 普通工廠模式
- 多個工廠方法模式
- 靜態工廠方法模式
普通工廠模式
剛剛我們說到,用工廠模式來創建人。先創建一個男人,他每天都“吃飯、睡覺、打豆豆”,然后我們再創建一個女人,她每天也“吃飯、睡覺、打豆豆”。
我們以普通工廠模式為例,在 project 目錄下新建一個FactoryTest.java。
示例代碼如下(下面的代碼塊中是全部的代碼,實際操作中應當按注釋創建相應的類再將方法寫入對應的類中):
// 二者共同的接口 interface Human{public void eat();public void sleep();public void beat(); }// 創建實現類 Male class Male implements Human{public void eat(){System.out.println("Male can eat.");}public void sleep(){System.out.println("Male can sleep.");}public void beat(){System.out.println("Male can beat.");} } //創建實現類 Female class Female implements Human{public void eat(){System.out.println("Female can eat.");}public void sleep(){System.out.println("Female can sleep.");}public void beat(){System.out.println("Female can beat.");} }// 創建普通工廠類 class HumanFactory{public Human createHuman(String gender){if( gender.equals("male") ){return new Male();}else if( gender.equals("female")){return new Female();}else {System.out.println("請輸入正確的類型!");return null;}} }// 工廠測試類 public class FactoryTest {public static void main(String[] args){HumanFactory factory = new HumanFactory();Human male = factory.createHuman("male");male.eat();male.sleep();male.beat();} }打開 terminal,輸入命令編譯并運行:
javac FactoryTest.java java FactoryTest普通工廠模式就是上面那樣子了,那么多個工廠方法模式又有什么不同呢?在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象。多個工廠方法模式是提供多個工廠方法,分別創建對象。
多個工廠方法模式
部分示例代碼,其他與上面普通工廠模式示例代碼一樣:
// 多個工廠方法 public class HumanFactory{public Male createMale() {return new Male();}public Female createFemale() {return new Female();} }// 工廠測試類 public class FactoryTest {public static void main(String[] args){HumanFactory factory = new HumanFactory();Human male = factory.createMale();male.eat();male.sleep();male.beat();} }運行結果與普通工廠模式的示例一樣。
靜態工廠方法模式
將上面的多個工廠方法模式里的方法置為靜態的,不需要創建實例,直接調用即可。
部分示例代碼:
// 多個工廠方法 public class HumanFactory{public static Male createMale() {return new Male();}public static Female createFemale() {return new Female();} }// 工廠測試類 public class FactoryTest {public static void main(String[] args){Human male = HumanFactory.createMale();male.eat();male.sleep();male.beat();} }總結:凡是出現了大量的產品需要創建,并且具有共同的接口時,可以通過工廠方法模式進行創建。在以上的三種模式中,第一種如果傳入的字符串有誤,不能正確創建對象,第三種相對于第二種,不需要實例化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。
抽象工廠
抽象工廠模式(Abstract Factory Pattern)是一種軟件開發設計模式。抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨的工廠封裝起來。如果比較抽象工廠模式和工廠模式,我們不難發現前者只是在工廠模式之上增加了一層抽象的概念。抽象工廠是一個父類工廠,可以創建其它工廠類。所以我們也叫它 “工廠的工廠”。
“女媧娘娘”只有一個,而我們的工廠卻可以有多個,因此在這里用作例子就不合適了。作為“女媧娘娘”生產出來的男人女人們,那就讓我們來當一次吃貨吧。(吃的東西總可以任性多來一點)
現在,假設我們有 A、B 兩個廚房。每個廚房擁有的餐具和食品都不一樣,但是用戶搭配使用的方式,比如刀子和蘋果、杯子和牛奶等等,我們假設是一致的。
抽象工廠模式特別適合于這樣的一種產品結構:產品分為幾個系列,在每個系列中,產品的布局都是類似的,在一個系列中某個位置的產品,在另一個系列中一定有一個對應的產品。這樣的產品結構是存在的,這幾個系列中同一位置的產品可能是互斥的,它們是針對不同客戶的解決方案,每個客戶都只選擇其一。
工廠方法模式、抽象工廠模式,傻傻分不清楚。
為了解釋得更清楚,先介紹兩個概念:
- 產品等級結構:比如一個抽象類是食物,其子類有蘋果、牛奶等等,則抽象食物與具體食物名稱之間構成了一個產品等級結構。食物是抽象的父類,而具體的食物名稱是其子類。
- 產品族:在抽象工廠模式中,產品族是指由同一個工廠生產的,位于不同產品等級結構中的一組產品。如 AKitchen 生產的蘋果、刀子,蘋果屬于食物產品等級結構中,而刀子則屬于餐具產品等級結構中。而 BKitchen 可能生成另一組產品,如牛奶、杯子。
因此工廠方法模式、抽象工廠模式最大的區別在于:
工廠方法模式:針對的是 一個產品等級結構。
抽象工廠模式:針對 多個產品等級結構。
總結
以上是生活随笔為你收集整理的设计模式之工厂模式和抽象工厂的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mvn test BUILD FAILU
- 下一篇: JavaWeb中使用session保持用