最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計模式中的簡單工廠模式解析

 更新時間:2023年11月27日 10:37:19   作者:一碼評川  
這篇文章主要介紹了Java設(shè)計模式中的簡單工廠模式解析,簡單工廠模式提供一個創(chuàng)建對象實例的功能,而無須關(guān)心其具體實現(xiàn),被創(chuàng)建實例的類型可以是接口、抽象類,也可以是具體的類,需要的朋友可以參考下

一、定義

定義: 提供一個創(chuàng)建對象實例的功能,而無須關(guān)心其具體實現(xiàn)。被創(chuàng)建實例的類型可以是接口、抽象類,也可以是具體的類。

PS: 我們都知道JAVA思想一直推崇“面向接口編程”。而接口的思想就是“封裝隔離”,即外部調(diào)用只能通過接口進行調(diào)用,外部調(diào)用并不知道內(nèi)部具體實現(xiàn),也就是說外部調(diào)用和內(nèi)部實現(xiàn)是被接口隔離開的。那么只要接口不變,內(nèi)部實現(xiàn)的變化就不會影響到外部應(yīng)用,使得系統(tǒng)更加靈活,增加系統(tǒng)的擴展性和可維護性,這也就是所謂的“接口是系統(tǒng)可拔插的保證”。

二、案例

假設(shè)有一個接口叫Api,然后有一個實現(xiàn)類Impl實現(xiàn)了它,如何在客戶端使用這個接口? So Easy !我們可以很快畫出這個案例的類圖并寫出代碼。

在這里插入圖片描述

/**
 * @ClassName Api
 * @Description: 定義一個接口
 * @author Jerry
 * @date 2016年3月26日 下午11:27:32
 */
public interface Api {
	/** 
	* @Description: 簡單實現(xiàn),傳入字符串打印 
	* @param @param str  
	*/
	public void test(String str);
}
/**
 * @ClassName Impl
 * @Description: 實現(xiàn)Api接口
 * @author Jerry
 * @date 2016年3月27日 上午10:12:27
 */
public class Impl implements Api {
	
	@Override
	public void test(String str) {
		System.out.println(str);
	}
}
/**
 * @ClassName Client
 * @Description: 外部調(diào)用
 * @author Jerry
 * @date 2016年3月27日 上午10:13:35
 */
public class Client {
 
	public static void main(String[] args) {
		Api api = new Impl();
		api.test("最愛你的人是我,你怎么舍得我難過");
	}
 
}

三、使用模式的情況

如果我們仔細(xì)想想就會發(fā)現(xiàn),這樣的設(shè)計違背了接口的設(shè)計原則。因為客戶端必須知道哪些具體實例實現(xiàn)了接口,并沒有實現(xiàn)“封裝隔離”。其實這里只是用到了接口的多態(tài)功能。

在這里插入圖片描述

/**
 * @ClassName Factory
 * @Description: 其余代碼和之前沒有變化,只增加這樣工廠類即可
 * @author Jerry
 * @date 2016年3月27日 上午10:23:30
 */
public class Factory {
	
	/** 
	* @Description: 通常把Factory當(dāng)成一個工具類,不需要創(chuàng)建類實例,所以直接使用靜態(tài)方法 
	* @param 當(dāng)然可以添加參數(shù),使得客戶端可以選擇自己想要初始化的實例,但不推薦,后面會解釋原因  
	* @return Api  返回一個具體實現(xiàn)
	* @throws 
	*/
	public static Api createApi() {
		return new Impl();
	}
}
/**
 * @ClassName Client
 * @Description: 外部調(diào)用
 * @author Jerry
 * @date 2016年3月27日 上午10:13:35
 */
public class Client {
 
	public static void main(String[] args) {
//		Api api = new Impl();
		Api api = Factory.createApi();	//無須在客戶端直接new具體實現(xiàn)
		api.test("最愛你的人是我,你怎么舍得我難過");
	}
 
}

一個簡單工廠理論上可以創(chuàng)造任何東西,所以又稱為“萬能工廠”。簡單工廠的本質(zhì)在于“選擇合適的實現(xiàn)類”,既然要選擇,那么肯定需要用戶去指定參數(shù),通常有以下3種:

  1. 來源于客戶端,指定參數(shù)。例如我們可以在創(chuàng)建實例的方法中加入?yún)?shù),這樣客戶端可以傳入具體參數(shù)來獲得自己想要的實例。但是這樣會帶來一個問題,客戶端必須知道每個參數(shù)的含義功能,使得向用戶暴露了一定的內(nèi)部實現(xiàn)細(xì)節(jié)。通常我們使用配置文件的寫法。
  2. 來源于配置文件,從配置文件獲取用于判斷的值,下文會具體介紹。
  3. 來源于程序運行期的某個值,比如內(nèi)存中的某個變量值,此方法屬于動態(tài)實現(xiàn)。
    • 使用配置文件進行優(yōu)化 我們使用properties文件,放在Factory同一個包下。
    • ImplClass=simpleFactory.Impl 然后修改Factory類,其余不變:
/**
 * @ClassName Factory
 * @Description: 其余代碼和之前沒有變化,只增加這樣工廠類即可
 * @author Jerry
 * @date 2016年3月27日 上午10:23:30
 */
public class Factory {
	
	public static Api createApi() {
		Properties properties = new Properties();
		InputStream in = null;
		try {
			in = Factory.class.getResourceAsStream("factory.properties");
			properties.load(in);
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		Api api = null;
		try {
			//使用反射創(chuàng)建實例
			api = (Api) Class.forName(properties.getProperty("ImplClass")).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return api;
	}
	
	/** 
	* @Description: 通常把Factory當(dāng)成一個工具類,不需要創(chuàng)建類實例,所以直接使用靜態(tài)方法 
	* @param 當(dāng)然可以添加參數(shù),使得客戶端可以選擇自己想要初始化的實例,但不推薦,后面會解釋原因  
	* @return Api  返回一個具體實現(xiàn)
	* @throws 
	*/
	@Deprecated
	public static Api createApi1() {
		return new Impl();
	}
	
}

使用配置文件的寫法好處在于,可以更加便捷的更改具體實現(xiàn)類,無須修改代碼,使得耦合性降低。

四、總結(jié)

何時選用簡單工廠

如果想要完全封裝隔離具體實現(xiàn),讓外部只能通過接口來操作封裝體。想要把對外創(chuàng)建對象的職責(zé)集中管理和控制,因為簡單工廠也稱萬能工廠,可以創(chuàng)建很多的,不相關(guān)的對象。

到此這篇關(guān)于Java設(shè)計模式中的簡單工廠模式解析的文章就介紹到這了,更多相關(guān)java簡單工廠模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaWeb項目FullCalendar日歷插件使用的示例代碼

    JavaWeb項目FullCalendar日歷插件使用的示例代碼

    本篇文章主要介紹了JavaWeb項目FullCalendar日歷插件使用的示例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式

    Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式

    這篇文章主要介紹了Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java8中的類型注解淺析

    Java8中的類型注解淺析

    這篇文章主要介紹了Java8中的類型注解淺析,java8之前,注解只能是在聲明的地方所使用,java8里面的注解則可以應(yīng)用在任何地方,需要的朋友可以參考下
    2014-06-06
  • Java Condition類案例詳解

    Java Condition類案例詳解

    這篇文章主要介紹了Java Condition類案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 聊一聊帶智能提示的spring-boot-starter

    聊一聊帶智能提示的spring-boot-starter

    這篇文章主要介紹了帶智能提示的spring-boot-starter的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-11-11
  • Java實現(xiàn)的校驗銀行卡功能示例

    Java實現(xiàn)的校驗銀行卡功能示例

    這篇文章主要介紹了Java實現(xiàn)的校驗銀行卡功能,結(jié)合完整實例形式分析了java針對銀行卡類型、歸屬地等信息的判斷、讀取相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • 一文看懂RabbitMQ消息丟失如何防止

    一文看懂RabbitMQ消息丟失如何防止

    這篇文章主要介紹了RabbitMQ消息丟失的場景,以及如何保證信息不丟失,看完這篇文章一定可以幫助你RabbitMQ有更深的理解,需要的朋友可以參考下
    2023-03-03
  • 使用Java繼承高頻陷阱解讀

    使用Java繼承高頻陷阱解讀

    本文分析Java編程中六大常見陷阱,包括偽繼承、父類脆弱性、構(gòu)造方法異常、里氏替換原則、靜態(tài)初始化問題及繼承復(fù)用誤區(qū),強調(diào)組合優(yōu)于繼承,通過線程池、模板方法、工廠模式等實現(xiàn)安全、靈活的代碼設(shè)計
    2025-08-08
  • Java自動拆裝箱簡單介紹

    Java自動拆裝箱簡單介紹

    這篇文章主要為大家詳細(xì)介紹了Java自動拆裝箱的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Java如何讓線程主動讓出 CPU

    Java如何讓線程主動讓出 CPU

    本文主要介紹了Java如何讓線程主動讓出 CPU,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05

最新評論

灵寿县| 宁波市| 固始县| 辽宁省| 林州市| 都兰县| 类乌齐县| 黎城县| 新乐市| 大丰市| 东明县| 江津市| 留坝县| 哈密市| 九龙坡区| 高唐县| 长丰县| 海阳市| 罗源县| 巩留县| 仁布县| 台南市| 泾阳县| 平江县| 海林市| 迭部县| 蒙阴县| 元江| 阆中市| 辽源市| 万源市| 绥化市| 岑巩县| 曲周县| 上高县| 右玉县| 华安县| 柳江县| 贺兰县| 新巴尔虎左旗| 定日县|