每天一個設計模式-1 簡單工廠 1.簡單工廠的定義 提供一個創建對象實例的功能,而無須關心其具體實現(核心)。 雖然不能讓模塊外部知道模塊內部的具體實現,但模塊內部是可以知道具體實現類的。乾脆在模塊內部建一個類,用這個類來創建介面,然後把創建號的介面返回給客戶端;這樣,外部應用就只需要根據這個類來獲 ...
每天一個設計模式-1 簡單工廠
1.簡單工廠的定義
提供一個創建對象實例的功能,而無須關心其具體實現(核心)。
雖然不能讓模塊外部知道模塊內部的具體實現,但模塊內部是可以知道具體實現類的。乾脆在模塊內部建一個類,用這個類來創建介面,然後把創建號的介面返回給客戶端;這樣,外部應用就只需要根據這個類來獲取相應的介面對象,通過這個介面對象就可以操作介面定義的方法了。顯然,這個類就像一個工廠,專門用來生成(生產)需要的介面對象。
2.簡單的例子
說明:
代碼:
Api:介面,wear是一個公有方法。
public interface Api { public void wear(); }Api
impl1:男生穿男士衣服的實現wear。
public class Impl1 implements Api { public Impl1(){ } public void finalize() throws Throwable { } public void wear(){ System.out.println("男生穿男士衣服"); } }Impl1
impl2:女生穿女士衣服的實現wear。
public class Impl2 implements Api { public Impl2(){ } public void finalize() throws Throwable { } public void wear(){ System.out.println("女士穿女士衣服"); } }Impl2
Factory:工廠類,通過選擇產生合適介面對象。
public class Factory { public Factory(){ } public void finalize() throws Throwable { } /** * * @param sex */ public static Api GetInstance(String sex){ if(sex=="男"){ return new Impl1(); }else{ return new Impl2(); } } }Factory
Client:用戶類
public class Client { public static Api m_Api; public Client(){ } public void finalize() throws Throwable { } /** * * @param args */ public static void main(String[] args){ System.out.println("男生"); m_Api = Factory.GetInstance("男"); m_Api.wear(); System.out.println("女生"); m_Api = Factory.GetInstance("女"); m_Api.wear(); } }Client
3.變通
Factory的參數的來源:
1.來源於客戶端。
2.來源於配置文件。
創建一個properties文件,內容可以是具體的實現類(依靠java的反射機制完成對象的創建,這樣也可以避免當有新的實現類時還要修改工廠代碼)、參數等
3.來源於程式運行期的某個值。
4.優缺點
優點:
幫助封裝:使組件外部真正的面向介面編程。
解耦:客戶端不知道內部的具體實現。
缺點:
可能增加客戶端的複雜度:用戶可能需要知道各個參數所代表的含義,並部分暴露了內部實現。
不方便創建子工廠:使用靜態方法來創建介面,也就不能通過寫簡單工廠類的子類來改變創建介面的方法的行為了,但一般不需要這麼做。
5.總結
客戶端通過簡單工廠創建一個實現介面的對象,然後面向介面編程,從客戶端來看,他根本不知道具體的實現是什麼,也不知道是如何實現的。因為我們在工廠內去new的具體實現對象,並沒有在客戶端內去new,因此客戶端不知道具體實現是什麼,這些都已經交給工廠了,而工廠的位置是在封裝體(介面和具體的實現方式)內的,所以工廠可以知道是如何實現的。
因此,簡單工廠的主要思想就是將具體實現與客戶隔離。
添加到反廣告列表