一開始了解了"簡單工廠模式"之后,在關於為什么不直接實例對象,而是利用工廠類來實例對象產生了疑惑。
經過多種渠道的了解,我最后的觀點是:這個工廠類不僅僅就只能有實例化對象這一個功能。舉例來說,如果我要在實例化這個對象之前先讀取某些配置,做各種各樣的預備工作呢?比如下面的代碼:
客戶端類:
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() ); }
可能有些人會想,為啥不把這些復雜的操作放在加法運算類中。但是這樣做,就違背了你一開始想要把具體的運算方法獨立出來的初衷,代碼耦合了。
比如我有個功能,就只需要加法這個對象而已,那不就尷尬了。