設計模式之工廠模式

2021-09-24 16:33:50 字數 3990 閱讀 9176

工廠模式是對構造物件,例項化,初始化過程的一種封裝。它幫我們解決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...