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

定義

抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類

角色
  • 抽象產(chǎn)品類A
  • 抽象產(chǎn)品類B
  • 抽象工廠類
  • 具體工廠類C(生成A)
  • 具體工廠類D(生產(chǎn)B)
UML類圖
抽象工廠模式UML類圖
代碼
  • IBenz.java
public interface IBenz {
    void run();
}
  • IBWM.java
public interface IBWM {
    void run();
}
  • HomeUseBenz.java
public class HomeUseBenz implements IBenz {
    @Override
    public void run() {
        System.out.println("first.HomeUseBenz run");
    }
}
  • HomeUseBWM.java
public class HomeUseBWM implements IBWM {
    @Override
    public void run() {
        System.out.println("first.HomeUseBWM run");
    }
}
  • BusinessUseBenz.java
public class BusinessUseBenz implements IBenz {
    @Override
    public void run() {
        System.out.println("first.BusinessUseBenz run");
    }
}
  • BusinessUseBWM.java
public class BusinessUseBWM implements IBWM {
    @Override
    public void run() {
        System.out.println("first.BusinessUseBWM run");
    }
}
  • AbstarctFactory.java
public abstract class AbstarctFactory {
    public abstract IBWM createBWM();
    public abstract IBenz createBenz();
}
  • HomeUseFactory.java
public class HomeUseFactory extends AbstarctFactory {
    @Override
    public IBWM createBWM() {
        return new HomeUseBWM();
    }
    @Override
    public IBenz createBenz() {
        return new HomeUseBenz();
    }
}
  • BusinessFactory.java
public class BusinessFactory extends AbstarctFactory {
    @Override
    public IBWM createBWM() {
        return new BusinessUseBWM();
    }              
    @Override
    public IBenz createBenz() {
        return new BusinessUseBenz();
    }
}
抽象工廠模式的優(yōu)點(diǎn)
  • 1 易于交換產(chǎn)品系列,由于具體工廠類,在一個(gè)應(yīng)用中只需要在初始化的時(shí)候出現(xiàn)一次,這就使得改變一個(gè)應(yīng)用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產(chǎn)品配置
  • 2 它讓具體的創(chuàng)建實(shí)例的過程與客戶端分離,客戶端是通過它們的抽象接口操作實(shí)例,產(chǎn)品的具體類名也被具體工廠的實(shí)現(xiàn)分離,不會(huì)出現(xiàn)在客戶代碼中
抽象工廠模式的缺點(diǎn)

如果想要增加一個(gè)不同的車型,則需要增加三個(gè)類以及修改三個(gè)工廠,比較繁瑣!

使用簡(jiǎn)單工廠改進(jìn)抽象工廠

UML類圖
簡(jiǎn)單工廠改進(jìn)抽象工廠UML.png
代碼
  • AllFactory.java
public class AllFactory {
    private static final String type = "home";
    //private static final String type = "business";
    public static IBenz createBenz(){
        IBenz benz = null;
        switch (type){
            case "home":
                benz = new HomeUseBenz();
                break;
            case "business":
                benz = new BusinessUseBenz();
                break;
        }
        return benz;
    }
    public static IBWM createBWM(){
        IBWM bwm = null;
        switch (type){
            case "home":
                bwm = new HomeUseBWM();
                break;
            case "business":
                bwm = new BusinessUseBWM();
                break;
        }
        return bwm;
    }
}

使用反射改進(jìn)抽象工廠方法
public class AllFactory {
    private final static String type="homeUse";
    //private final static String type="businessUse";

    public static IBenz createBenz() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        String className = type.substring(0, 1).toUpperCase() + type.substring(1) + "Benz";
        //獲取包路徑
        String packageName = new Object() {
            public String getPackageName() {
                return this.getClass().getPackage().getName();
            }
        }.getPackageName();
        Class<? extends IBenz> clazz = (Class<? extends IBenz>) Class.forName(packageName+"."+className);
        return clazz.newInstance();
    }
    public static IBWM createBWM() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        String className = type.substring(0, 1).toUpperCase() + type.substring(1) + "BWM";
        //獲取包路徑
        String packageName = new Object() {
            public String getPackageName() {
                return this.getClass().getPackage().getName();
            }
        }.getPackageName();
        Class<? extends IBWM> clazz = (Class<? extends IBWM>) Class.forName(packageName +"."+className);
        return clazz.newInstance();
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,888評(píng)論 0 14
  • 抽象工廠模式(Abstract factory pattern) 抽象工廠模式(Abstract factory ...
    Airing閱讀 1,167評(píng)論 0 9
  • 在苗青家的幾天中,春生享受了最高級(jí)別的待遇,活兒不讓干,拿起掃帚掃地的權(quán)利也被剝奪了:往往是掃帚剛拿起來,就被阿姨...
    西嶺布衣閱讀 158評(píng)論 0 3
  • 2018-02-17 姓名:郭祥華 組別:315期六項(xiàng)精進(jìn)努力一組 【日精進(jìn)打卡第105天】 【知~學(xué)習(xí)】 背誦《...
    華英雄_712d閱讀 236評(píng)論 0 0
  • 安裝 yum -y install docker-iowget -qO- https://get.docker.c...
    Martin_阿錘閱讀 275評(píng)論 0 0

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