簡單工廠,是負責對象的建立,將對象的建立放在一個方法裏面 不少時候 就使用一個靜態的方法來建立對象,這樣能夠不用使用建立對象方法來實例化,直接使用類名來調用,可是這樣就不能經過繼承來改變工廠的創造行爲。 把對象抽出來創造的意義在於 工廠可能會被用的不少地方,如上面的例子不單單是手機店,還有可能使用的手機單據裏面.java
看代碼 SampleFactory 裏面仍是要傳入 一個 手機品牌來具體的new ,可是若是手機品牌多了,那代碼將會被的很臃腫,因此這裏須要 使用反射加上配置文件來簡化。 設計模式
工廠方法模式 : 聲明一個建立 對象的方法,而後由子類去決定要實例化那個,也就是將類的實例化推遲到子類。好比 手機專賣店 可能有小米專賣店,蘋果專賣店。 經過繼承的方式來有子類去決定 實例 化那個 小米專賣店就實例化 紅米,note,米4 等,蘋果專賣店就實例化 6,6plus,5s等 注意 依賴: 店鋪依賴 手機,具體的手機也須要 依賴手機 ,從而倒置這種依賴關係,高層組建和底層組建 依賴一樣的 東西! ide
抽象工廠模式 : 定義一個接口 用來建立相關和依賴的產品族,注意這裏是產品族,就是一類產品,好比下面代碼中 顯示屏 有 小米顯示屏,華爲顯示屏,蘋果顯示屏 抽象工廠模式的uml 圖: spa
具體要點: 全部的工廠都是封裝建立對象的設計
簡單工廠並不能算是一個設計模式,可是它仍然將具體的實體類從應用程序中解耦。 code
工廠方法 是經過繼承的方式 由子類去決定具體實例化那一個對象,將具體類的實例化推遲到子類中對象
抽象工廠方法: 經過工廠暴露出來的接口,來建立一類產品,也就是建立產品族。繼承
全部工廠都是爲了將對應的具體類 從應用程序中解耦,使程序設計 更加知足依賴抽象這一個原則。接口
代碼以下:get
package www.factory.com; import www.prodcut.com.Batteries; import www.prodcut.com.Recharger; import www.prodcut.com.Screen; public interface PhonePartsFactroy { public Batteries getBatteries(); public Screen getScreen(); public Recharger getRecharger(); } package www.factory.com; import www.prodcut.com.Batteries; import www.prodcut.com.IphoneBatteries; import www.prodcut.com.IphoneRecharger; import www.prodcut.com.IphoneScreen; import www.prodcut.com.Recharger; import www.prodcut.com.Screen; public class IPhonePartsFactroy implements PhonePartsFactroy{ @Override public Batteries getBatteries() { return new IphoneBatteries(); } @Override public Screen getScreen() { return new IphoneScreen(); } @Override public Recharger getRecharger() { return new IphoneRecharger(); } } package www.factory.com; import www.prodcut.com.Batteries; import www.prodcut.com.HuaWeiBatteries; import www.prodcut.com.HuaWeiRecharger; import www.prodcut.com.HuaWeiScreen; import www.prodcut.com.Recharger; import www.prodcut.com.Screen; public class HuaweiPartsFactroy implements PhonePartsFactroy{ @Override public Batteries getBatteries() { return new HuaWeiBatteries(); } @Override public Screen getScreen() { return new HuaWeiScreen(); } @Override public Recharger getRecharger() { return new HuaWeiRecharger(); } } package www.prodcut.com; public interface Batteries { public String getBattersName(); } package www.prodcut.com; public interface Recharger { public String getRechargerName(); } package www.prodcut.com; public interface Screen { public String getScreenName(); } package www.prodcut.com; public class HuaWeiBatteries implements Batteries{ @Override public String getBattersName() { return "華爲原裝電池"; } } package www.prodcut.com; public class IphoneBatteries implements Batteries{ @Override public String getBattersName() { return "蘋果原裝電池"; } } package www.prodcut.com; public class HuaWeiRecharger implements Recharger{ @Override public String getRechargerName() { return "華爲手機充電器"; } } package www.prodcut.com; public class IphoneRecharger implements Recharger{ @Override public String getRechargerName() { return "蘋果手機充電器"; } } package www.prodcut.com; public class HuaWeiScreen implements Screen{ @Override public String getScreenName() { return "華爲顯示屏"; } } package www.prodcut.com; public class IphoneScreen implements Screen{ @Override public String getScreenName() { return "蘋果顯示屏"; } } package www.test.com; import www.factory.com.HuaweiPartsFactroy; import www.factory.com.IPhonePartsFactroy; import www.factory.com.PhonePartsFactroy; public class Test { public static void main(String[] args){ PhonePartsFactroy phonePartsFactroy = new IPhonePartsFactroy(); String name = phonePartsFactroy.getBatteries().getBattersName(); System.out.println(name); PhonePartsFactroy huaweiPartsFactroy = new HuaweiPartsFactroy(); String name1 = huaweiPartsFactroy.getBatteries().getBattersName(); System.out.println(name1); } }