1. 程式人生 > 其它 >23種設計模式(三)抽象工廠模式

23種設計模式(三)抽象工廠模式

簡要概括23種設計模式之抽象工廠模式

三、抽象工廠模式

​ 前面介紹的工廠方法模式中考慮的是一類產品的生產,如汽車廠商生產汽車,手機廠商生產手機。但是在生活中手機廠商不一定只生產手機,例如華為還生產路由器和電腦。很顯然工廠模式是解決不了這一類問題的。

​ 在這裡可以引入產品族和產品等級的概念。正如下圖,海爾 和 TCL 兩個廠商,它們同時都能生產電視機和空調,在這裡同一個廠商生產的系列就是一個產品族,而同種產品就是產品等級。工廠模式只能解決產品等級上的問題,而產品族則是由抽象工廠模式來解決。

3.1 抽象工廠模式的特點

抽象工廠模式除了擁有工廠模式的特點以外,還擁有

  • 可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理。

  • 當需要產品族時,抽象工廠可以保證客戶端始終只使用同一個產品的產品組。

  • 抽象工廠增強了程式的可擴充套件性,當增加一個新的產品族時,不需要修改原始碼,滿足開閉原則。

缺點

  • 當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。增加了系統的抽象性和理解難度。

3.2 抽象工廠模式的實現

抽象工廠模式的主要角色如下。

  • 抽象工廠(Abstract Factory):提供了建立產品的介面,它包含多個建立產品的方法 newProduct(),可以建立多個不同等級的產品。

  • 具體工廠(Concrete Factory):主要是實現抽象工廠中的多個抽象方法,完成具體產品的建立。

  • 抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能,抽象工廠模式有多個抽象產品。

  • 具體產品(ConcreteProduct):實現了抽象產品角色所定義的介面,由具體工廠來建立,它同具體工廠之間是多對一的關係。

請看下面的例項,我們用小米和華為的例子來實現抽象工廠模式

/**
 * 抽象的產品工廠
 *
 * @author kimariyb
 */
public interface ProductFactory {
    /**
     * 生產手機
     * @return 生產的手機型號
     */
    PhoneProduct phoneProduct();

    /**
     * 生產路由器
     * @return 生產的路由器型號
     */
    RouterProduct routerProduct();
}

/**
 * 手機產品介面
 *
 * @author kimariyb
 */
public interface PhoneProduct {
    void start();
    void close();
    void call();
}

/**
 * 路由器介面
 *
 * @author kimariyb
 */
public interface RouterProduct {
    void start();
    void close();
    void sentWeb();
}

/**
 * 小米手機
 *
 * @author kimariyb
 */
public class XiaomiPhone implements PhoneProduct{
    @Override
    public void start() {
        System.out.println("小米手機開機");
    }

    @Override
    public void close() {
        System.out.println("小米手機關機");
    }

    @Override
    public void call() {
        System.out.println("小米手機打電話");
    }
}

/**
 * 華為手機
 *
 * @author kimariyb
 */
public class HuaweiPhone implements PhoneProduct{
    @Override
    public void start() {
        System.out.println("華為手機開機");
    }

    @Override
    public void close() {
        System.out.println("華為手機關機");
    }

    @Override
    public void call() {
        System.out.println("華為手機打電話");
    }
}

/**
 * 小米路由器
 *
 * @author kimariyb
 */
public class XiaomiRouter implements RouterProduct{

    @Override
    public void start() {
        System.out.println("小米路由器開機");
    }

    @Override
    public void close() {
        System.out.println("小米路由器關機");
    }

    @Override
    public void sentWeb() {
        System.out.println("小米路由器傳送網路");
    }
}

/**
 * 華為路由器
 *
 * @author kimariyb
 */
public class HuaweiRouter implements RouterProduct{
    @Override
    public void start() {
        System.out.println("華為路由器開機");
    }

    @Override
    public void close() {
        System.out.println("華為路由器關機");
    }

    @Override
    public void sentWeb() {
        System.out.println("華為路由器傳送網路");
    }
}

/**
 * 小米工廠
 * @author kimariyb
 */
public class XiaomiFactory implements ProductFactory{
    @Override
    public PhoneProduct phoneProduct() {
        return new XiaomiPhone();
    }

    @Override
    public RouterProduct routerProduct() {
        return new XiaomiRouter();
    }
}


/**
 * 華為工廠
 *
 * @author kimariyb
 */
public class HuaweiFactory implements ProductFactory{
    @Override
    public PhoneProduct phoneProduct() {
        return new HuaweiPhone();
    }

    @Override
    public RouterProduct routerProduct() {
        return new HuaweiRouter();
    }
}

簡單的分析改例項,小米和華為都能生產手機和路由器,很顯然這涉及到了產品族,需要使用抽象工廠模式來實現。