抽象工廠模式 設計模式學習

2021-09-06 08:36:34 字數 4040 閱讀 8467

抽象工廠模式(abstract factory),提供乙個建立一系列相關或相互依賴物件的介面,而無需指定他們具體的類。

以下給出抽象工廠方法模式的uml圖:

回到《大話設計模式》裡面的雙資料庫訪問的例子:

namespace

set

}private

string

_name;

public

string

name

set }}

class

department

set

}private

string

_deptnmae

set }}

//iuser介面,用於客戶端訪問,解除與具體資料庫訪問的耦合

inte***ce

iuser

class

sqlserveruser : iuser

public user getuser(int

id)

}class

accessuser : iuser

public user getuser(int

id)

}inte***ce

idepartment

class

sqlserverdepartment : idepartment

public department getdepartment(int

id)

}class

accessdepartment : idepartment

public department getdepartment(int

id)

}inte***ce

ifactory

//sqlserver例項化工廠,負責例項化sqlserveruser和sqlserverdepartment

class

sqlserve***ctory : ifactory

public

idepartment createdepartment()

}//access例項化工廠,負責例項化accessuser和accessdepartment

class

accessfactory : ifactory

public

idepartment createdepartment()

}class

program

} }

其實以上**就叫做抽象工廠模式了,當只有乙個user表的時候,就叫工廠方法模式。當有了多個表了,就叫抽象工廠模式。但是以上**是非常不好的,為什麼?例如當你還要增加乙個project表的時候,就需要增加三個類,iproject、sqlserverproject、accessproject,同時還需要更改ifactory、sqlserve***ctory、accessfactory。增加一張表就要更改三個類,這個是比較悲劇的。

因此,以下給出乙個用簡單工廠模式來優化抽象工廠模式的**:

namespace

set

}private

string

_name;

public

string

name

set }}

class

department

set

}private

string

_deptnmae

set }}

//iuser介面,用於客戶端訪問,解除與具體資料庫訪問的耦合

inte***ce

iuser

class

sqlserveruser : iuser

public user getuser(int

id)

}class

accessuser : iuser

public user getuser(int

id)

}inte***ce

idepartment

class

sqlserverdepartment : idepartment

public department getdepartment(int

id)

}class

accessdepartment : idepartment

public department getdepartment(int

id)

}class

dataaccess

return

result;

}public

static idepartment createdepartment() //

這是department的簡單工廠

return

result;}}

class

program

} }

經過簡單工廠模式優化之後,客戶端就不再依賴於sqlserve***ctory或accessfactory了,帶到了解耦的目的。如果要新增乙個project,只需要新增響應類,但改就只需要修改dataaccess就可以了(在dataaccess裡面在新增乙個簡單工廠)。很明顯者不是最終方案,因為簡單工廠方法還是要修改,switch case。

以下還有通過反射實現的更加好的方案:

namespace

set

}private

string

_name;

public

string

name

set }}

class

department

set

}private

string

_deptnmae

set }}

//iuser介面,用於客戶端訪問,解除與具體資料庫訪問的耦合

inte***ce

iuser

class

sqlserveruser : iuser

public user getuser(int

id)

}class

accessuser : iuser

public user getuser(int

id)

}inte***ce

idepartment

class

sqlserverdepartment : idepartment

public department getdepartment(int

id)

}class

accessdepartment : idepartment

public department getdepartment(int

id)

}class

dataaccess

public

static

idepartment createdepartment()

}class

program

} }

xml version="1.0" encoding="utf-8" 

?>

<

configuration

>

<

>

<

add

key="db"

value

="access"

/>

>

configuration

>

在以上的**中,要增加乙個project表的話,只需要新增三個project相關的類(擴充套件),再修改dataaccess,在其中增加乙個createproject()方法就可以了。

設計模式學習 抽象工廠模式

抽象工廠模式,提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。抽象工廠模式的優點與缺點 優點 易於交換產品系列,由於具體工廠類在乙個應用中只需要在初始化的時候出現一次,這樣使得改變乙個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置。它讓具體的建立例項過程與...

設計模式學習 抽象工廠模式

模式概述 提供乙個建立一系列相關或相互依賴物件的介面,而無需制定它們具體的類,抽象工廠 abstract factory 模式又稱為kit模式,屬於物件建立型模式。抽象工廠模式與工廠方法模式最大的區別在於 工廠方法模式針對的是乙個產品等級結構,而抽象工廠模式則針對的是多個產品等級結構。所以在抽象工廠...

設計模式 工廠模式 抽象工廠模式

建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...