抽象工厂模式定义: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(); } }