日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java使用简单工厂模式对面向接口编程模式的深度解耦实现

發布時間:2025/6/15 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java使用简单工厂模式对面向接口编程模式的深度解耦实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Java和C#的編程世界里,并沒有出現像C++那樣的多脈繼承,它們只支持單一的繼承,或者多級繼承,這一變化最大的影響,我覺得是大大的降低了編程的難度,因為沒有了C++的多級多脈繼承,所以接口出現了,它支持多重繼承,當然它的主要目的是為了實現解耦,將定義與實現分離。今天就來談談我對Java中面向接口編程的看法,以及個人的一些改進。


先看下面一段簡短的代碼,


public static void main(String[] args){loginDao dao = new loginDaoImpl();String result = dao.loginInvalidate("root", "123");System.out.println("result:" + result);}


重點是包含new的那一行,這是我剛做項目時的寫法,定義一個接口,一個該接口的實現類,測試的時候,通過多態實例化接口即可。但是如此,我們不得不想,面向接口的初衷是為了將定義與實現進行分離,從而達到解耦的目的。但是如果像上面的那種方式使用,那么對于一個大型的項目,那得修改多少這樣的類,工作量大的嚇人,所以,我們需要重新思考面向接口的使用。針對這種情況,決定采用簡單工廠模式,配合單例模式,對面向接口編程進行深度解耦。


下面我們再看一段簡短的代碼:


public static void main(String[] args){loginDao dao = DataFactory.createLoginDao();String result = dao.loginInvalidate("root", "123");System.out.println("result:" + result);}


這段代碼和上一段代碼有一個明顯的差別,就是使用了DataFactory這個自定義的工廠類,下面我們來詳細研究這個工廠類:DataFactory


package com.azer.shop.factory;import com.azer.shop.constant.Constants; import com.azer.shop.dao.loginDao; import com.azer.shop.utils.LoadProperty;public class DataFactory {/*** 實例化登錄驗證接口* * @return*/public static loginDao createLoginDao(){try{return (loginDao) Class.forName(LoadProperty.getClassName(Constants.LOGINDAOIMPL)).newInstance();} catch (Exception e){e.printStackTrace();return null;} } }

其實這段代碼也很簡單,就是實例化一個接口,不過并沒有使用new,取而代之的是newInstance。兩者的區別主要體現在newInstance是一種弱類型。低效率的方式,只能調用無參構造。而new是一種強類型。相對高效的創建對象的方式,能調用任何public構造函數。??在這個方法里,我們使用反射來實例化一個對象,在Class.forName()方法的參數中只需要提供完整的類名(包名+類名),就可以實例化該類。為了進一步解耦,我們將該完整的類名寫入到一個屬性文件中,取出的時候根據鍵來獲取完整的類名。進一步的改進,我們將鍵名寫入到一個常量文件中,當以后需要修改的時候,只需要修改該常量即可,非常方便。Constants.LOGINDAOIMPL代表屬性配置文件中鍵的名稱,LoadProperty.getClassName()的目的是為了獲取接口實現類的完整類名名稱。


package com.azer.shop.utils;import java.io.InputStream; import java.util.Properties;import com.azer.shop.constant.Constants;@SuppressWarnings("serial") public class LoadProperty extends Properties {private static LoadProperty instance;public static LoadProperty getInstance(){if (instance != null){return instance;}else{makeInstance();return instance;}}private static synchronized void makeInstance(){if (instance == null){instance = new LoadProperty();}}private LoadProperty(){InputStream inputStream = getClass().getResourceAsStream(Constants.FILE_NAME);try{load(inputStream);} catch (Exception e){System.out.println("配置文件出錯!!");e.printStackTrace();}}public static String getClassName(String classNameKey){return LoadProperty.getInstance().getProperty(classNameKey);} }

下面是完整的源碼,提供給讀者進行學習、交流。

總結

以上是生活随笔為你收集整理的Java使用简单工厂模式对面向接口编程模式的深度解耦实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。