Markdown版本筆記 | 個人GitHub首頁 | 個人博客 | 個人微信 | 個人郵箱 |
---|---|---|---|---|
MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
工廠模式是咱們最經常使用的實例化對象模式了,是用工廠方法代替new操做的一種模式。著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統能夠說是隨處可見。由於工廠模式就至關於建立實例對象的new,咱們常常要根據類Class生成實例 對象,如A a=new A() 工廠模式也是用來建立實例對象的,因此之後new時就要多個心眼,是否能夠考慮使用工廠模式,雖然這樣作,可能多作一些工做,但會給你係統帶來更大的可擴 展性和儘可能少的修改量。java
簡單工廠、工廠方法、抽象工廠的區別git
簡單工廠,只有一個產品接口
github
工廠方法,既有產品接口
也有工廠接口
微信
把不一樣的產品放在實現了工廠接口的不一樣工廠類裏面
,分割了工廠類的職能。 抽象工廠框架
簡單工廠模式(Simple Factory Pattern)又叫靜態工廠方法模式(Static FactoryMethod Pattern),是經過專門定義一個類來負責建立其餘類的實例
,被建立的實例一般都具備共同的父類或接口。ide
做用:代替構造函數建立對象
函數
簡單工廠模式中包含的角色及其相應的職責以下:性能
JDK中體現:Integer.valueOf、Class.forName code
女媧造人案例對象
首先定義人類的總稱,能夠經過抽象類或接口定義
public interface IHuman { public void talk(); }
而後定義你所須要的具體的人種,不一樣的產品具備不一樣的特性或功能
class WhiteHuman implements IHuman { @Override public void talk() { System.out.println("白色人種會說English"); } }
class BlackHuman implements IHuman { @Override public void talk() { System.out.println("黑人能夠說話,通常人聽不懂"); } }
class YellowHuman implements IHuman { @Override public void talk() { System.out.println("黃色人種會說漢語"); } }
public class HumanFactory { public static IHuman createHuman(Class<? extends IHuman> c) { //經過泛型限定了要生產的對象的類型 //注意,生成產品的方式能夠是各類各樣的,好比最多見的方式爲根據傳入的String或int值,構造出不一樣的對象 IHuman human = null; try { human = (IHuman) Class.forName(c.getName()).newInstance(); //這裏是經過反射方式生成的 } catch (Exception e) { System.out.println("構造失敗"); } return human; } }
因爲簡單工廠模式新增產品時須要直接修改工廠類,違反了開放封閉原則。所以可使用反射來建立實例對象,確保可以遵循開放封閉原則。
IHuman yellowHuman = HumanFactory.createHuman(YellowHuman.class); yellowHuman.talk();
定義一個用於建立對象的接口,讓子類決定實例化哪一個類。
定義了一個工廠接口,由抽象工廠類的子類決定要實例化的類是抽象產品類的哪個子類。
工廠方法讓類的實例化推遲到子類。
角色說明:
優勢
缺點
工廠方法模式新增產品時只需新建一個工廠類便可,符合開放封閉原則;而簡單工廠模式須要直接修改工廠類,違反了開放封閉原則。
public interface IWork { void doWork(); }
class StudentWork implements IWork { @Override public void doWork() { System.out.println("學生的工做是作做業!"); } }
class TeacherWork implements IWork { @Override public void doWork() { System.out.println("老師的工做是審批做業!"); } }
工廠方法是建立一個框架,讓【子類】決定要如何實現具體的產品。
public interface IWorkFactory { IWork getWork(); }
根據不一樣的產品,定義不一樣的具體工廠類
class StudentWorkFactory implements IWorkFactory { @Override public IWork getWork() { return new StudentWork();//子類決定如何實現具體的產品 } }
class TeacherWorkFactory implements IWorkFactory{ @Override public IWork getWork() { return new TeacherWork();//子類決定如何實現具體的產品 } }
IWorkFactory studentWorkFactory = new StudentWorkFactory(); IWork studentWork = studentWorkFactory.getWork();//使用StudentWorkFactory構建StudentWork studentWork.doWork();//學生的工做是作做業! IWorkFactory teacherWorkFactory = new TeacherWorkFactory(); IWork teacherWork = teacherWorkFactory.getWork();//使用TeacherWorkFactory構建TeacherWork teacherWork.doWork();//老師的工做是審批做業!
爲建立一組相關或者相互依賴的對象提供一個接口,而無需指定它們的具體類。
工廠方法模式每一個工廠只能建立一種類型的產品,而抽象工廠模式則可以建立多種類型的產品。
例如:硬盤工廠只生產硬盤這種產品,而電腦工廠則組合不一樣的硬盤、內存、CPU等生產出電腦來。
角色說明:
應用場景:生產多個產品組合的對象時。
優勢:代碼解耦,建立實例的工做與使用實例的工做分開,使用者沒必要關心類對象如何建立。
缺點:若是增長新的產品,則修改抽象工廠和全部的具體工廠,違反了開放封閉原則
工廠方法模式與抽象工廠模式比較
產品分類
成了抽象工廠的重點。定義人類的統稱
public interface IHuman { void talk(); void sex();//定義性別,注意,這個是用來給人類【分類】的,在抽象工廠中,很重要的一步就是合理的分類 }
人類的接口定義好,而後根據接口建立兩個抽象類,也就是兩個【產品等級】
public abstract class AbstractYellowHuman implements IHuman { @Override public void talk() { System.out.println("黃種人會說漢語"); } }
public abstract class AbstractWhiteHuman implements IHuman { @Override public void talk() { System.out.println("白色人種會說English"); } }
而後就是些實現類了
public class YellowFemaleHuman extends AbstractYellowHuman { @Override public void sex() { System.out.println("女性黃種人"); } }
public class YellowMaleHuman extends AbstractYellowHuman { @Override public void sex() { System.out.println("男性黃種人"); } }
public class WhiteFemaleHuman extends AbstractWhiteHuman { @Override public void sex() { System.out.println("女性白種人"); } }
public class WhiteMaleHuman extends AbstractWhiteHuman { @Override public void sex() { System.out.println("男性白種人"); } }
public interface IHumanFactory { IHuman createYellowHuman();//製造黃色人種 IHuman createWhiteHuman();//製造白色人種 }
這個抽象類的目的就是減小下邊實現類的代碼量。
public abstract class AbstractHumanFactory implements IHumanFactory { protected IHuman createHuman(HumanEnum humanEnum) { IHuman human = null; //給定一個性別人種,建立一我的類出來 專業術語是產生產品等級 try { human = (IHuman) Class.forName(humanEnum.getValue()).newInstance();//直接產生一個實例 } catch (Exception e) { e.printStackTrace(); } return human; } }
男性建立工廠,只建立男性
public class MaleHumanFactory extends AbstractHumanFactory { //建立一個男性白種人 @Override public IHuman createWhiteHuman() { return super.createHuman(HumanEnum.WhiteMaleHuman); } //建立一個男性黃種人 @Override public IHuman createYellowHuman() { return super.createHuman(HumanEnum.YelloMaleHuman); } }
女性建立工廠,只建立女性
public class FemaleHumanFactory extends AbstractHumanFactory { //建立一個女性白種人 @Override public IHuman createWhiteHuman() { return super.createHuman(HumanEnum.WhiteFemaleHuman); } //建立一個女性黃種人\ @Override public IHuman createYellowHuman() { return super.createHuman(HumanEnum.YelloFemaleHuman); } }
產品定義好了,工廠也定義好了,萬事俱備只欠東風,那咱就開始造人吧,哦,不對,女媧開始造人了:
public class Test { //女媧創建起了兩條生產線,分別是男性生產線和女性生產線 public static void main(String[] args) { //第一條生產線,男性生產線,能夠生產各類各樣的男性 IHumanFactory maleHumanFactory = new MaleHumanFactory(); IHuman maleYellowHuman = maleHumanFactory.createYellowHuman();//生產黃色的男性 IHuman maleWhiteHuman = maleHumanFactory.createWhiteHuman();//生產白色的男性 //第二條生產線,女性生產線,能夠生產各類各樣的女性 IHumanFactory femaleHumanFactory = new FemaleHumanFactory(); IHuman femaleYellowHuman = femaleHumanFactory.createYellowHuman();//生產黃色的女性 IHuman femaleWhiteHuman = femaleHumanFactory.createWhiteHuman();//生產白色的女性 } }
2019-4-6