抽象工厂模式定义:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
(为创建一组相关或互相依赖的对象提供一个接口,而且无需指定他们的具体类)
上一章学习了工厂模式,这两个模式有很大的相似的地方,但是使用的情景不一样,所以要采用不一样方式。对比下这两个模式:
工厂模式 抽象工厂模式
针对一个产品的结构等级(不同肤色人种) 针对的是多个产品的等级结构(不同肤色人种又分男性女性)
一个抽象的产品类 多个抽象的产品类
可以派生出多个实体产品类(派生出黄、白、黑三个人种) 每个抽象产品类可以派生出多个实体产品类(男黑,女黑,男白,女白,男黄,女黄)
每个具体的工厂类只能生产一个具体产品类的实例 每个具体的工厂类可以生产多个具体产品类的实例
抽象工厂模式的使用场景:
- 一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式
/** * @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(); } }