設計模式學習之抽象工廠模式

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

                                (爲建立一組相關或互相依賴的對象提供一個接口,並且無需指定他們的具體類)學習

上一章學習了工廠模式,這兩個模式有很大的類似的地方,可是使用的情景不同,因此要採用不同方式。對比下這兩個模式:spa

                           工廠模式                                                                                          抽象工廠模式code

               針對一個產品的結構等級(不一樣膚色人種)                                   針對的是多個產品的等級結構(不一樣膚色人種又分男性女性)對象

               一個抽象的產品類                                                                      多個抽象的產品類blog

              能夠派生出多個實體產品類(派生出黃、白、黑三我的種)           每一個抽象產品類能夠派生出多個實體產品類(男黑,女黑,男白,女白,男黃,女黃)接口

              每一個具體的工廠類只能生產一個具體產品類的實例                     每一個具體的工廠類能夠生產多個具體產品類的實例ci

抽象工廠模式的使用場景:get

  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();
    }
}
相關文章
相關標籤/搜索