為什么用簡單工廠模式,而不是直接實例化對象


一開始了解了"簡單工廠模式"之后,在關於為什么不直接實例對象,而是利用工廠類來實例對象產生了疑惑。
經過多種渠道的了解,我最后的觀點是:這個工廠類不僅僅就只能有實例化對象這一個功能。舉例來說,如果我要在實例化這個對象之前先讀取某些配置,做各種各樣的預備工作呢?比如下面的代碼:

客戶端類:

public class ConsoleUser {
    public static void main(String[] args) {
        //新建運算類
        Operation operation;
        //各種亂七八糟的操作
        System.out.println("新建對象a");
        System.out.println("新建對象b");
        System.out.println("讀取配置1");
        System.out.println("給對象a賦值");
        System.out.println("讀取配置2");
        System.out.println("給對象b賦值");
        //創建加法類實例對象,並賦值給運算類
        operation = new OperationPlus();
        operation.num1 = 5;
        operation.num2 = 2;
        //打印返回的計算結果
        System.out.println(operation.getResult());
            }
}

 

這就是你們說的,不用工廠,而是直接創建對象。假如要多次調用,那豈不是還要把這些繁瑣的操作再做一遍?
如果把這些復雜繁瑣的操作,提取到工廠的方法中,就會讓編碼得到很大的簡化。

工廠類:

public class OperationFactory {
    public static Operation createOperation(char operate) {
        Operation operation = null;
        switch (operate) {
        case '+':
            System.out.println("新建對象a");
            System.out.println("新建對象b");
            System.out.println("讀取配置1");
            System.out.println("給對象a賦值");
            System.out.println("讀取配置2");
            System.out.println("給對象b賦值");
            operation = new OperationPlus();
            break;
        case '-':
            operation = new OperationSub();
            break;
        case '/':
            operation = new OperationDiv();
            break;
        case '*':
            operation = new OperationMul();
            break;            
        }
        return operation;
    }
}

 


客戶端類(使用簡單工廠方法):

public class ConsoleUser {
    public static void main(String[] args) {
        //新建運算類
        Operation operation;
        //工廠新建加法運算對象
        operation = OperationFactory.createOperation('+');
        operation.num1 = 5;
        operation.num2 = 2;
        //對象調用方法返回信息
        System.out.println(operation.getResult());
    }
}

 

 

為了驗證我的說法,特地去SessionFactoryImpl這個實現類中找到了opensession這個方法,代碼如下:

SessionFactoryImpl中的源碼:

    private SessionImpl openSession(
        Connection connection,
        boolean autoClose,
        long timestamp,
        Interceptor sessionLocalInterceptor
    ) {
        return new SessionImpl(
                connection,
                this,
                autoClose,
                timestamp,
                sessionLocalInterceptor == null ? interceptor : sessionLocalInterceptor,
                settings.getDefaultEntityMode(),
                settings.isFlushBeforeCompletionEnabled(),
                settings.isAutoCloseSessionEnabled(),
                settings.getConnectionReleaseMode()
            );
    }

可能有些人會想,為啥不把這些復雜的操作放在加法運算類中。但是這樣做,就違背了你一開始想要把具體的運算方法獨立出來的初衷,代碼耦合了。
比如我有個功能,就只需要加法這個對象而已,那不就尷尬了。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM