由hibernate中學習工廠模式
工廠方法:
protected ConnectionProvider createConnectionProvider(Properties properties) {
//利用工廠方法產生一個新例項,properties是讀取配置檔案後生成儲存在記憶體的屬性對
return ConnectionProviderFactory.newConnectionProvider(properties);}
具體的工廠方法public static ConnectionProvider newConnectionProvider(Properties properties) throws HibernateException { ConnectionProvider connections; //根據配置的內容(而不是寫死在程式碼中),生成新的例項 String providerClass = properties.getProperty( Environment.CONNECTION_PROVIDER ); if ( providerClass != null ) { connections = initializeConnectionProviderFromConfig( providerClass ); } else if ( c3p0ConfigDefined( properties ) && c3p0ProviderPresent() ) { connections = initializeConnectionProviderFromConfig("org.hibernate.connection.C3P0ConnectionProvider"); } else if ( properties.getProperty( Environment.DATASOURCE ) != null ) { connections = new DatasourceConnectionProvider(); } else if ( properties.getProperty( Environment.URL ) != null ) { connections = new DriverManagerConnectionProvider(); } else { connections = new UserSuppliedConnectionProvider(); } //利用properties,對新生成的例項進行初始化 connections.configure( properties ); return connections; }
總結:靈活多變,程式碼未寫死,可以在配置檔案中靈活改變具體內容,並且在生成物件時進行框架邏輯上的控制。滿足了生成例項物件多樣化的同時還達到了對一類物件的初始化時的靈活性
抽象工廠:某一類工廠有一系列的產品,各個工廠生產不同的系列(nike和adidas都生產衣服,鞋,球),通過不同的具體工廠new出不同的系列產品(nike工廠new出的是nike衣服,nike鞋,nike球),例如在軟體的面板功能中,通過更改具體的面板工廠,程式中new出的就是不同的面板主題(青春工廠:青春按鈕,青春標題欄,青春邊框&&成熟工廠:成熟按鈕,成熟標題欄,成熟邊框)