Java設計模式從精通到入門五 抽象工廠方法模式
定義
抽象工廠類為建立一組相關和相互依賴的物件提供一組介面,而無需指定一個具體的類。
這裡我得把工廠方法模式得定義拿出來做一下比較:定義一個建立物件的介面,由子類決定例項化哪一個類。工廠方法是一個類的例項化延遲到其子類。這裡強調一下,工廠方法包括:簡單工廠模式,和工廠方法模式等一些系列的工廠方法模式的變形。
案例
現在有兩個產品,一個是手機,一個是電腦。手機和電腦都是不同的生產商生產的。我們要實現一個工廠管理系統,記錄華為和蘋果著兩家工廠生產的手機和電腦資訊。
已知,華為和蘋果都有自己的工廠,華為的叫做華為工廠,蘋果的叫做蘋果工廠。華為工廠生產華為手機和華為電腦。蘋果工廠生產蘋果手機和蘋果電腦。用抽象工廠模式實現改系統,他的設計圖如 圖一:
程式碼如下
Factory類:
/** * @InterfaceName Factory * @Description 抽象工廠 * @Author ouyangkang * @Date 2019-01-19 11:25 **/ public interface Factory { /** * @Author ouyangkang * @Description 生產手機 * @Date 11:25 2019/1/19 * @param * @return com.設計模式.factory.abstractfactory.Phone **/ Phone createPhone(); /** * @Author ouyangkang * @Description 生產電腦 * @Date 11:26 2019/1/19 * @param * @return com.設計模式.factory.abstractfactory.Computer **/ Computer createComputer(); }
IphoneFactory類
/** * @ClassName IphoneFactory * @Description 蘋果廠商之生產蘋果的產品 * @Author ouyangkang * @Date 2019-01-19 11:36 **/ public class IphoneFactory implements Factory{ @Override public Phone createPhone() { return new Iphone(); } @Override public Computer createComputer() { return new IphoneComputer(); } }
HuaWeiFactory類
/** * @ClassName HuaWeiFactory * @Description TODO * @Author ouyangkang * @Date 2019-01-19 11:37 **/ public class HuaWeiFactory implements Factory { @Override public Phone createPhone() { return new HuaWeiIphone(); } @Override public Computer createComputer() { return new HuaWeiComputer(); } }
Phone類
/** * @InterfaceName Phone * @Description 手機介面 * @Author ouyangkang * @Date 2019-01-19 11:21 **/ public interface Phone { /** * @Author ouyangkang * @Description 手機生產商 * @Date 11:23 2019/1/19 * @param * @return void **/ void name(); /** * @Author ouyangkang * @Description 通訊功能 * @Date 11:22 2019/1/19 * @param * @return void **/ void communication(); }
Iphone類
/** * @ClassName Iphone * @Description TODO * @Author ouyangkang * @Date 2019-01-19 11:27 **/ public class Iphone implements Phone { @Override public void name() { System.out.println("蘋果手機"); } @Override public void communication() { System.out.println("用蘋果手機進行通訊"); } }
HuaWeiPhone類
/** * @ClassName HuaWeiPhone * @Description TODO * @Author ouyangkang * @Date 2019-01-19 11:33 **/ public class HuaWeiPhone implements Phone { @Override public void name() { System.out.println("華為手機"); } @Override public void communication() { System.out.println("用華為手機進行通訊"); } }
Computer類
/** * @InterfaceName Computer * @Description 電腦 * @Author ouyangkang * @Date 2019-01-19 11:23 **/ public interface Computer { /** * @Author ouyangkang * @Description 電腦生產商 * @Date 11:24 2019/1/19 * @param * @return void **/ void name(); /** * @Author ouyangkang * @Description 上網 * @Date 11:24 2019/1/19 * @param * @return void **/ void surf(); }
HuaWeiComputer類和IPhoneComputer類和上面HuaWeiIphone和Iphone類似程式碼就不重複了。
Client類
public class Client { public static void main(String[] args) { //蘋果廠商 Factory iphoneFactory = new IphoneFactory(); Computer iphoneFactoryComputer = iphoneFactory.createComputer(); iphoneFactoryComputer.name(); iphoneFactoryComputer.surf(); System.out.println("--------------------------"); Phone phone = iphoneFactory.createPhone(); phone.name(); phone.communication(); System.out.println("--------------------------"); // 華為廠商 Factory huaWeiFactory = new HuaWeiFactory(); Computer huaWeiFactoryComputer = huaWeiFactory.createComputer(); huaWeiFactoryComputer.surf(); huaWeiFactoryComputer.name(); System.out.println("--------------------------"); Phone huaWeiPhone = huaWeiFactory.createPhone(); huaWeiPhone.communication(); huaWeiPhone.name(); } }
執行得到結果
蘋果電腦 用蘋果電腦上網 -------------------------- 蘋果手機 用蘋果手機進行通訊 -------------------------- 用華為電腦上網 華為電腦 -------------------------- 用華為手機進行通訊 華為手機
總結
上面得簡單UML類圖我用Visual Paradigm 15.2劃了好久,想起了學校外教教我們畫這個得時候,後悔當初學得不好,現在只能自己慢慢摸索。
抽象工廠從定義上是很好理解的,為建立一組相關得或者相互依賴得物件提供一個介面,無需指定一個具體得類。一開始自己對於抽象工廠和工廠方法模式總是混淆,但是如果咬文嚼字得看這個兩個設計模式得定義得話,然後看程式碼還是很好區別得。如果你看到一個Factory只有定義一個例項化子類得介面,那麼你就可以認為它是工廠方法模式,如果你看到一個Factory中定義了多個例項化子類的不同介面的話,那麼他就是抽象工廠方法。