设计模式学习之抽象工厂模式

抽象工厂模式定义:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

                                (为创建一组相关或互相依赖的对象提供一个接口,而且无需指定他们的具体类)

上一章学习了工厂模式,这两个模式有很大的相似的地方,但是使用的情景不一样,所以要采用不一样方式。对比下这两个模式:

                           工厂模式                                                                                          抽象工厂模式

               针对一个产品的结构等级(不同肤色人种)                                   针对的是多个产品的等级结构(不同肤色人种又分男性女性)

               一个抽象的产品类                                                                      多个抽象的产品类

              可以派生出多个实体产品类(派生出黄、白、黑三个人种)           每个抽象产品类可以派生出多个实体产品类(男黑,女黑,男白,女白,男黄,女黄)

              每个具体的工厂类只能生产一个具体产品类的实例                     每个具体的工厂类可以生产多个具体产品类的实例

抽象工厂模式的使用场景:

  1. 一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式
/**
 * @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();
    }
}

 

posted @ 2018-01-03 17:53  随心-HL  阅读(176)  评论(0编辑  收藏  举报