工廠模式是對構造物件,例項化,初始化過程的一種封裝。它幫我們解決new
物件的問題,假如我們需要建立乙個person
物件, 我們常用的方式是person person = new person();
但是這樣會導致把這個物件誕生的過程死死的**在我們的**當中,宿主類與例項化過程強耦合在一起。
我們看這樣乙個例子:
現有乙個studentdao
介面
public
inte***ce
studentdao
以及乙個實現類studentdaoimpl
:
public
class
studentimpl
implements
studentdao
@override
public
void
update
(student stu)
}
如果我們想使用studentdao
的功能,那麼我們會建立乙個例項:
studentdao studentdao =
newstudentdaoimpl()
;// stu建立省略
studentdao.
add(stu)
;
這樣我們可能會在同乙個宿主類當中建立多個這樣的例項,就導致建立過程死死的耦合在一起。我們的**中可能會有很多這樣的例項。假如有一天,你的上司來和你說studentdaoimpl
的實現邏輯想要變一下,你的做法可能是重新寫一遍studentdaoimpl
,那麼如果等你花了很久把這個類的實現邏輯重新改完了,你的上司又和你說這樣不太好還是改回來吧,那你是不是想殺了他的衝動都有(/斜眼笑)。
這只是一種情況,大量的例項建立耦合在**當中導致**非常的笨重,對後期的維護和擴充套件都會帶來很多麻煩。其實我們並不關心到底使用的是哪個物件更不關心它是怎麼產生出來的,我們只需要乙個介面型別的物件比如studentdao
。
物件是對現實世界的一種抽象,所以為了解決這種問題我們可以放眼與現實世界。如果我們要用電腦,我們不需要自己製造乙個電腦,而是去買一台,他們在工廠中產生,至於電腦是怎麼製造的,內部結構是什麼我們並不需要知道,只要是乙個電腦就行。同樣寫**亦如此,將具體實現放到工廠中製造,只要最後乙個studentdao
或者其他的什麼鬼就可以,於是就這樣工廠模式就此誕生了。
還是上面的例子,studentdao
:
建立studentdao
介面
public
inte***ce
studentdao
建立studentdao
介面的實現類
public
class
studentdaoimpl
implements
studentdao
@override
public
void
update
(string name)
}
寫乙個beans.properties
配置檔案,裡面包含著具體建立哪乙個實現類
xyz.guqing.dao.studentdao=xyz.guqing.dao.studentdaoimpl
首先我們需要造乙個工廠,beanfactory
用於生產物件
public
class
beanfactory
catch
(exception e)
finally
catch
(ioexception e)}}
// studentdao例項的獲取方法
public
static studentdao getstudentdao()
catch
(exception e)
}}
根據工廠獲取例項物件
public
class
beanfactorytest
}
輸出結果:
張三學生被studentdaoimpl的add方法新增到資料庫....
假設現在需要更改studentdaoimpl
的實現邏輯,那麼我們不需要去改它,重新建立乙個studentdaoimpl2
public
class
studentdaoimpl2
implements
studentdao
@override
public
void
update
(string name)
}
然後在beans.properties
的配置檔案中更換實現類為studentdaoimpl2
xyz.guqing.dao.studentdao=xyz.guqing.dao.studentdaoimpl2
這樣就可以了,其他的我們什麼都不需要改變,再次執行測試類,可以看到
studentdaoimpl2的 add 方法張三學生被呼叫....
這就是工廠模式。
甚至還可以對以上內容稍作修改
public
class
beanfactory
// 解析配置檔案
saxreader reader =
newsaxreader()
; document document = reader.
read
(in)
;//獲取根元素
element root = document.
getrootelement()
; iterator it = root.
elementiterator()
;while
(it.
hasnext()
)return beanattributemap;
}catch
(exception ex)
}public
static object getbean
(string beanname)
mapbeanattribute =
readbeanattribute()
; string classname = beanattribute.
get(beanname)
;// 通過class.forname根據名稱將這個類載入到jvm
class clazz
= null;
trycatch
(exception e)
}}
然後寫乙個beans.xml
配置檔案
<?xml version="1.0" encoding="utf-8"?>
>
"studao"
classname
="xyz.guqing.dao.studentdaoimpl2"
>
bean
>
beans
>
使用:
public
class
beanfactorytest
}
如此比之前就更加通用了 設計模式 設計模式之工廠模式
工廠方法模式 建立模式 使用場景?作用?形態?場景 大量類似的實體類 要建立的實體類都是同一本質的東西 披薩 有部分類似功能 準備 烘烤 切法 實現方式不一樣 準備的材料不同 烘烤時間不同 切法不同 將繁瑣複雜的建立類的過程聚集在一起,有序清晰 把具體例項化的過程從客戶 中抽離 作用 1 將建立物件...
c 設計模式 之 工廠模式之 工廠模式
1 uml類圖 實現和依賴關係 實現 sportfactory jeepfactory hatchbackfactory 實現 ifactory 介面 sportcar jeepcar hatchbackcar 實現 icar 介面 依賴 ifactory 依賴 icar sportfactory ...
設計模式 工廠模式之簡單工廠模式
定義 由乙個工廠物件 工廠類 來指定建立某乙個產品類的例項。使用場景 客戶端只需傳入指定的引數即可,工廠類負責建立的物件較少 因為指定了傳入的引數 介面類 本想用iphone命名的,見諒 public inte ce phone實現介面類 public class huaweiphone imple...