設(shè)計(jì)模式《抽象工廠模式》

引言

??上一回怎么說了工廠方法模式,這回咱們來講一講工廠模式的另外一種表現(xiàn),今天的主角"抽象工廠模式"。

示例地址

??Demo

先上類圖

image

看看定義

??為創(chuàng)建一組相關(guān)或者相互依賴的對象提供一個(gè)接口,而不需要指定它們的具體類。

使用場景

??一個(gè)對象族有相同的約束時(shí)可以使用抽象工廠模式。

抽象工廠中的2個(gè)概念

產(chǎn)品族

??位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族。代表的是縱向結(jié)構(gòu)。
??舉個(gè)例子,華為有華為筆記本,華為手機(jī),華為手環(huán)等,小米也有小米手機(jī),小米筆記本,小米手環(huán)。華為這個(gè)系列的構(gòu)成了家族。稱為產(chǎn)品族。

產(chǎn)品等級(jí)

??產(chǎn)品等級(jí)結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu)。代表的是橫向結(jié)構(gòu)。
??舉個(gè)列子,一個(gè)抽象類手機(jī),下面可以生成小米手機(jī)、華為手機(jī)。

產(chǎn)品族與產(chǎn)品等級(jí)圖

image

產(chǎn)品類

1. 手機(jī)
/**
 * 手機(jī)
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午10:19.
 */
public interface IPhone {
    void phone();
}


/**
 * 小米手機(jī)
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午10:25.
 */
public class XiaomiPhone implements IPhone {
    @Override
    public void phone() {
        System.out.println("小米手機(jī)");
    }
}


/**
 * 華為手機(jī)
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午10:23.
 */
public class HuaweiPhone implements IPhone {
    @Override
    public void phone() {
        System.out.println("華為手機(jī)");
    }
}
2. 筆記本
/**
 * 筆記本
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午10:27.
 */
public interface IComputer {
    void computer();
}


/**
 * 小米筆記本
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午10:44.
 */
public class XiaomiComputer implements IComputer {
    @Override
    public void computer() {
        System.out.println("小米筆記本");
    }
}


/**
 * 華為筆記本
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午10:37.
 */
public class HuaweiComputer implements IComputer {
    @Override
    public void computer() {
        System.out.println(" 華為筆記本");
    }
}
3. 手環(huán)
/**
 * 手環(huán)
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午10:55.
 */
public interface IBracelet {
    void bracelet();
}


/**
 * 小米手環(huán)
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午10:59.
 */
public class XiaomiBracelet implements IBracelet {
    @Override
    public void bracelet() {
        System.out.println("小米手環(huán)");
    }
}


/**
 * 華為手環(huán)
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午10:57.
 */
public class HuaweiBracelet implements IBracelet {
    @Override
    public void bracelet() {
        System.out.println("華為手環(huán)");
    }
}
4. 工廠類
/**
 *  抽象工廠
 * @author 512573717@qq.com
 * @created 2018/7/9  上午10:16.
 */
public abstract class ProductFactory {
    // 創(chuàng)建手機(jī)
    public abstract IPhone createPhone();
    // 創(chuàng)建筆記本
    public abstract IComputer createComputer();
    // 創(chuàng)建手環(huán)
    public  abstract IBracelet createBracelet();
}


/**
 * 小米
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午11:09.
 */
public class Xiaomi extends ProductFactory {

    @Override
    public IPhone createPhone() {
        return new XiaomiPhone();
    }

    @Override
    public IComputer createComputer() {
        return new XiaomiComputer();
    }

    @Override
    public IBracelet createBracelet() {
        return new XiaomiBracelet();
    }
}


/**
 * 華為
 *
 * @author 512573717@qq.com
 * @created 2018/7/9  上午11:03.
 */
public class Huawei extends ProductFactory {

    @Override
    public IPhone createPhone() {
        return new HuaweiPhone();
    }

    @Override
    public IComputer createComputer() {
        return new HuaweiComputer();
    }

    @Override
    public IBracelet createBracelet() {
        return new HuaweiBracelet();
    }
}
5. Client測試
 //華為系列
 System.out.println("華為");
 ProductFactory huawei = new Huawei();
 huawei.createPhone().phone();
 huawei.createComputer().computer();
 huawei.createBracelet().bracelet();

 //小米系列
 System.out.println("小米");
 ProductFactory xiaomi=new Xiaomi();
 xiaomi.createPhone().phone();
 xiaomi.createComputer().computer();
 xiaomi.createBracelet().bracelet();

總結(jié)

??抽象工廠模式是某一系列的產(chǎn)品的工廠。可以創(chuàng)建多個(gè)不同類型的產(chǎn)品。例如上面所說的 華為是一個(gè)產(chǎn)品工廠,能夠創(chuàng)建手機(jī) 、筆記本、手機(jī)等多個(gè)類型的產(chǎn)品。

抽象工廠 與工廠方法的區(qū)別

??工廠方法模式針對的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu);而抽象工廠模式則需要面對多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容