抽象工廠模式定義:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.ide
(爲建立一組相關或互相依賴的對象提供一個接口,並且無需指定他們的具體類)學習
上一章學習了工廠模式,這兩個模式有很大的類似的地方,可是使用的情景不同,因此要採用不同方式。對比下這兩個模式:spa
工廠模式 抽象工廠模式code
針對一個產品的結構等級(不一樣膚色人種) 針對的是多個產品的等級結構(不一樣膚色人種又分男性女性)對象
一個抽象的產品類 多個抽象的產品類blog
能夠派生出多個實體產品類(派生出黃、白、黑三我的種) 每一個抽象產品類能夠派生出多個實體產品類(男黑,女黑,男白,女白,男黃,女黃)接口
每一個具體的工廠類只能生產一個具體產品類的實例 每一個具體的工廠類能夠生產多個具體產品類的實例ci
抽象工廠模式的使用場景:get
/** * @author Lin * @Date 2018/1/3. */ public interface Human { /** * 每一個人種有相應的膚色 */ void getColor(); /** *人會說話 */ void talk(); /** * 人有不一樣的性別 */ void getSex(); }
/** * @author Lin * @Date 2018/1/3. */ public abstract class AbstractYelloHuman implements Human{ @Override public void getColor() { System.out.println("黃色人種的皮膚是黃色的。"); } @Override public void talk() { System.out.println("黃色人種會說話,通常說的都是雙字節。"); } } /** * @author Lin * @Date 2018/1/3. */ public abstract class AbstractWhiteHuman implements Human{ @Override public void getColor() { System.out.println("白色人種的皮膚是白色的。"); } @Override public void talk() { System.out.println("白色人種會說話,通常說的都是單字節。"); } } /** * @author Lin * @Date 2018/1/3. */ public abstract class AbstractBlackHuman implements Human{ @Override public void getColor() { System.out.println("黑色人種的皮膚是黑色的。"); } @Override public void talk() { System.out.println("黑色人種會說話,通常說的都是鬼話。"); } }
/** * @author Lin * @Date 2018/1/3. */ public class FemaleBlackHuman extends AbstractBlackHuman{ @Override public void getSex() { System.out.println("女性黑種人"); } } /** * @author Lin * @Date 2018/1/3. */ public class FemaleWhiteHuman extends AbstractWhiteHuman{ @Override public void getSex() { System.out.println("女性白種人"); } } /** * @author Lin * @Date 2018/1/3. */ public class FemaleYellowHuman extends AbstractYelloHuman{ @Override public void getSex() { System.out.println("女性黃種人"); } }
/** * @author Lin * @Date 2018/1/3. */ public interface HumanFactory { /** * 製造一個黃色人種 * @return */ Human createYelloHuman(); /** *製造一個白色人種 * @return */ Human createWhiteHuman(); /** *製造一個黑色人種 * @return */ Human createBlackHuman(); }
/** * @author Lin * @Date 2018/1/3. */ public class FemaleFactory implements HumanFactory{ @Override public Human createYelloHuman() { return new FemaleYellowHuman(); } @Override public Human createWhiteHuman() { return new FemaleWhiteHuman(); } @Override public Human createBlackHuman() { return new FemaleBlackHuman(); } } /** * @author Lin * @Date 2018/1/3. */ public class MaleFactory implements HumanFactory{ @Override public Human createYelloHuman() { return new MaleYellowHuman(); } @Override public Human createWhiteHuman() { return new MaleWhiteHuman(); } @Override public Human createBlackHuman() { return new MaleBlackHuman(); } }