工廠模式

基礎(chǔ)使用

工廠模式是創(chuàng)建型模式,是一種常用的獲取對象實例的方式。

1、根據(jù)名稱獲取實例

思路:根據(jù)傳入的類別名稱,來分別實例化不同的實例。

    /**
     * 1、根據(jù)名稱獲取實例
     * @param name 實例的名稱
     * @return
     */
    public Object getObject(String name){
        if(name == null){
            return null;
        }
        if(name.equalsIgnoreCase("Object1")){
            //返回名稱對應(yīng)的實例,簡化demo,這里不新建類了
            return new Object();
        }
        if(name.equalsIgnoreCase("Object2")){
            //返回名稱對應(yīng)的實例,簡化demo,這里不新建類了
            return new Object();
        }
        if(name.equalsIgnoreCase("Object3")){
            //返回名稱對應(yīng)的實例,簡化demo,這里不新建類了
            return new Object();
        }
        return null;
    }

2、通過反射獲取實例

根據(jù)名稱獲取的方式十分笨拙,隨著業(yè)務(wù)的增長,工廠類會越來越重,代碼耦合度太高,下面使用類的反射機(jī)制來獲取實例。

    /**
     * 2、通過反射的方式,加載類
     * 通過名稱實例化的方式,需要在項目組耦合大量的類,且獲取實例的邏輯會越來越復(fù)雜
     * 這里通過反射簡化
     * @param clazz
     * @return
     */
    public Object getObject(Class clazz){
        Object object = null;
        try {
            object = Class.forName(clazz.getName()).newInstance();
        } catch (Exception e){
            e.printStackTrace();
        }
        return object;
    }

sl4j源碼分析(摘要)

工廠模式的經(jīng)典使用場景就是日志記錄,sl4j在獲取日志實例的時候會使用如下代碼:

    private static final Logger logger = LoggerFactory.getLogger(Factory.class);

下面我們來看看LoggerFactory是如何獲取日志實例的。

public static Logger getLogger(String name) {
        ILoggerFactory iLoggerFactory = getILoggerFactory();
        return iLoggerFactory.getLogger(name);
    }

首先通過getILoggerFactory()方法獲取工廠類的實例,第一次調(diào)用時會進(jìn)行初始化,無特殊配置會返回缺省的工廠實例,然后通過該工廠實例來實例化Logger對象:

    @Override
    public final Logger getLogger(final String name) {

        if (name == null) {
            throw new IllegalArgumentException("name argument cannot be null");
        }

        // 如果訪問主節(jié)點直接返回
        if (Logger.ROOT_LOGGER_NAME.equalsIgnoreCase(name)) {
            return root;
        }

        int i = 0;
        Logger logger = root;

        // 有緩存時直接返回
        Logger childLogger = (Logger) loggerCache.get(name);
        if (childLogger != null) {
            return childLogger;
        }

        // 創(chuàng)建時,按照層級一層一層的創(chuàng)建下去
        String childName;
        while (true) {
            int h = LoggerNameUtil.getSeparatorIndexOf(name, i);
            //當(dāng)h == -1時,說明已經(jīng)拿到了類的全路徑名稱
            if (h == -1) {
                childName = name;
            } else {
                childName = name.substring(0, h);
            }
            // move i left of the last point
            i = h + 1;
            synchronized (logger) {
                childLogger = logger.getChildByName(childName);
                if (childLogger == null) {
                    childLogger = logger.createChildByName(childName);
                    loggerCache.put(childName, childLogger);
                    incSize();
                }
            }
            logger = childLogger;
            //將最后一個節(jié)點實例化后返回
            if (h == -1) {
                return childLogger;
            }
        }
    }

代碼的具體邏輯已經(jīng)在注釋中標(biāo)注出來,工廠模式的根本目的是將對象的創(chuàng)建和業(yè)務(wù)場景進(jìn)行解耦,如sl4j中的LoggerFactory可以獲取項目中任意類的日志實例。

?著作權(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)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,653評論 19 139
  • 1.接口基礎(chǔ)回顧 設(shè)計模式六大原則,其中依賴倒轉(zhuǎn)原則,強(qiáng)調(diào)我們應(yīng)該面向接口編程,那什么是接口?接口的作用? 接口如...
    孟婆湯不解渴閱讀 904評論 0 3
  • 該文章屬于劉小壯原創(chuàng),轉(zhuǎn)載請注明:劉小壯[http://www.itdecent.cn/u/2de707c93d...
    劉小壯閱讀 13,040評論 29 59
  • 今天學(xué)習(xí)下最常見的工廠模式,工廠模式細(xì)分下來有三大類: 他們的目標(biāo)都是一樣的:封裝對象的創(chuàng)建。但是實現(xiàn)手段和使用場...
    西木柚子閱讀 2,225評論 7 28
  • 有鶴來 跨鶴高飛意壯哉,云霄一羽雪皚皚。此行莫恨天涯遠(yuǎn),咫尺理塘歸去來。2017一10一26日早
    勝者為王王臣森閱讀 307評論 0 0

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