Java設(shè)計模式之抽象工廠模式

簡述

前面我們學(xué)習(xí)過簡單工廠模式,它解決了一類對象的創(chuàng)建問題,但是有的時候?qū)ο蠛軓?fù)雜,數(shù)量多,還分為了好幾種類別。如果只有一個工廠,面多如此多的產(chǎn)品,這個工廠需要實現(xiàn)的邏輯就太復(fù)雜了,所以我們希望把工廠分為好幾個,便于產(chǎn)品規(guī)則的維護。設(shè)計者只需要提供給用戶一個抽象工廠,抽象工廠內(nèi)部會自動選擇使用哪個工廠生產(chǎn)哪種產(chǎn)品

案例

  • 這里以兩種工廠為例,一種生產(chǎn)水果,一種生產(chǎn)文具,代碼以打印到控制臺的方式來簡要說明
  • demo代碼可到抽象工廠模式中下載

【產(chǎn)品接口】

public interface IProduct {
    //案例中不提供實現(xiàn)類,以打印到控制臺的方式說明
}

【工廠接口】

/**
 * 抽象工廠和具體工廠都要實現(xiàn)本接口
 */
public interface IProductFactory {
    public IProduct createProduct(String productNo);
}

【具體工廠1 - 水果】

public class ProductFactory1 implements IProductFactory {
    /**
     * @param productNo 產(chǎn)品編號
     * @return 本具體工廠只負(fù)責(zé)生產(chǎn)水果,水果編號都以A開頭
     */
    @Override
    public IProduct createProduct(String productNo) {
        //這里不提供IProduct的實現(xiàn)類,以打印文字的方法簡略表示
        if("A1".equals(productNo)){
            System.out.println("生產(chǎn)一個蘋果");
        }else if ("A2".equals(productNo)){
            System.out.println("生產(chǎn)一個鴨梨");
        }else {
            System.out.println("水果工廠暫不生產(chǎn)該水果");
        }

        return null;
    }
}

【具體工廠2 - 文具】

/**
 * 本具體工廠只生產(chǎn)文具,產(chǎn)品編號以B開頭
 */
public class ProductFactory2 implements IProductFactory {
    @Override
    public IProduct createProduct(String productNo) {
        if("B1".equals(productNo)){
            System.out.println("生產(chǎn)了一支筆");
        }else if ("B2".equals(productNo)){
            System.out.println("生產(chǎn)了一個橡皮");
        }else {
            System.out.println("本文具工廠暫不生產(chǎn)該文具");
        }
        return null;
    }
}

【抽象工廠】

/**
 * 抽象工廠,負(fù)責(zé)制定某個具體工廠生產(chǎn)某件產(chǎn)品
 */
public class ProductFactory implements IProductFactory {

    public IProduct createProduct(String productNo) {
        char type = productNo.charAt(0);
        IProductFactory factory = null;

        if(type == 'A'){
            factory = new ProductFactory1();
        }else if(type == 'B'){
            factory = new ProductFactory2();
        }

        if(factory != null) factory.createProduct(productNo);

        return null;
    }
}

【測試】

public class Test {
    public static void main(String[] args) {

        ProductFactory productFactory = new ProductFactory();
        productFactory.createProduct("A1");//生產(chǎn)一個蘋果
        productFactory.createProduct("A2");//生產(chǎn)一個鴨梨
        productFactory.createProduct("B1");//生產(chǎn)了一支筆
        productFactory.createProduct("B2");//生產(chǎn)了一個橡皮
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容