Java設計模式學習記錄-簡單工廠模式、工廠方法模式
前言
之前介紹了設計模式的原則和分類等概述。今天開啟設計模式的學習,首先要介紹的就是工廠模式,在介紹工廠模式前會先介紹一下簡單工廠模式,這樣由淺入深來介紹。
簡單工廠模式
做法:創建一個工廠(方法或類)用來制造對象。
當一個人想要用手機的時候,需要自己創建手機然後來使用。
如下:
public class IphoneX { public IphoneX(){ System.out.println("##### 制造iphoneX #####"); } }
public class Iphone8 { publicIphone8(){ System.out.printf("##### 制造iphone8 #####"); } }
public class Customer { /** * 使用手機 */ @Test public void usePhone(){ IphoneX iphoneX = new IphoneX(); Iphone8 iphone8 = new Iphone8(); } }
這種實現方式,客戶在使用的手機的時候會看到手機的具體實現方式,客戶就和手機的耦合度非常高,其實客戶並不關心手機具體是什麽實現的,為了降低耦合,就出現了工廠類,把手機的制造過程放到工廠裏去實現。客戶想使用手機時,將手機型號傳遞給工廠類裏創建手機的方法就可以了。而不必關心手機制造的整個過程,這樣一來在創建手機的過程中添加額外的一些操作也顯得很靈活。這種實現方式就是下面要介紹的簡單工廠模式
public abstract class Iphone { public Iphone(){ } }
public class IphoneX extends Iphone{ public IphoneX(){ System.out.println("##### 制造iphoneX #####"); } }
public class Iphone8 extends Iphone{ public Iphone8(){ System.out.printf("##### 制造iphone8 #####"); } }
工廠類:
public class FoxconnFactory { /** * 創建手機 * @param model 型號 * @return */ public static Iphone createIphone(String model){ switch (model){ case "X":{ return new IphoneX(); } case "8":{ return new Iphone8(); } default:break; } return null; } }
客戶類:
public class Customer { /** * 使用手機 */ @Test public void usePhone(){ Iphone iphoneX = FoxconnFactory.createIphone("X");
Iphone iphone8 = FoxconnFactory.createIphone("8");
}
}
簡單工廠模式的類圖如下:
這個類圖上包含三個角色:
- 工廠類角色(Factory):這是本模式的核心,含有一定的商業邏輯和判斷邏輯。在Java中往往由一個具體類實現。
- 抽象產品角色(Abstract Iphone Class):一般是具體產品繼承的父類或者實現的接口,在Java中由一個具體類來實現。
- 具體產品角色(IphoneX):工廠類所創建的對象就是此角色的實例,在Java中由一個具體類來實現。
在實際情況中如果我們想使用新的型號的手機,就需要改造FoxconnFactory這個類(在類中加case)這違背了開閉原則,因為在使用新產品的時候,工廠類是屬於被動改變的。為了解決這種情況,就出現了工廠方法模式,工廠方法模式與簡單工廠模式的最大不同在於,簡單工廠模式只有一個(對於一個項目或一個獨立模塊而言)工廠類,而工廠方法模式有一組實現了相同接口的工廠類。
工廠方法模式提供了多個實現相同接口的工廠類,這樣每個工廠類生產不同類型的產品,這樣如果新增加一款手機只需要新增加一個生產此款手機的工廠類就可以了,不用去改變已經存在的工廠類。這樣就符合開閉原則了。
例子如下:
public abstract class Iphone { public Iphone(){ } }
public class IphoneX extends Iphone{ public IphoneX(){ System.out.println("##### 制造iphoneX #####"); } }
public class Iphone8 extends Iphone{ public Iphone8(){ System.out.printf("##### 制造iphone8 #####"); } }
工廠類:
public interface Factory { Iphone createIphone(); }
public class FoxconnFactory implements Factory{ /** * 創建iphoneX手機 * @return */ @Override public Iphone createIphone(){ return new IphoneX(); } }
public class HeShuoFactory implements Factory { /** * 生產iphone8手機 * @return */ @Override public Iphone createIphone() { return new Iphone8(); } }
客戶類:
public class Customer { /** * 使用手機 */ @Test public void usePhone(){ Factory foxconn = new FoxconnFactory(); Factory heshuo = new HeShuoFactory(); Iphone iphoneX = foxconn.createIphone(); Iphone iphone8 = heshuo.createIphone(); } }
工廠方法模式結構圖如下:
此結構圖的中含四個角色:
- 抽象工廠角色(代加工工廠):這是工廠方法模式的核心,它與應用程序無關,是具體工廠角色必須實現的接口或者必須繼承的父類。在Java中他由抽象類或者接口來實現。
- 具體工廠角色(富士康工廠):它含有與具體業務邏輯有關的代碼。由應用程序調用,以創建對應的具體產品對象。在Java中它由具體類來實現。
- 抽象產品角色(蘋果手機抽象類):它是具體產品繼承父類或者是實現的接口。在Java中一般有抽象類或接口來實現。
- 具體產品角色(iphoneX手機):具體工廠角色所創建的對象就是此角色的實例。在Java中由具體的類來實現。
雖然說工廠方法模式解決了簡單工廠模式的不滿足開閉原則的問題,但是這也造成了,代碼量的成本增加,當產品數量過多時,維護起來會很麻煩,反而簡單工廠沒有這麽麻煩,當多個產品需要修改時,簡單工廠模式仍然只需要修改唯一的工廠類。無論哪種方式都是以實現功能為目的。
對比一下得出個人結論:簡單工廠模式,更簡潔方便。工廠方法模式更松散,更先進。
Java設計模式學習記錄-簡單工廠模式、工廠方法模式