抽象工廠模式(abstract factory),提供乙個建立一系列相關或相互依賴物件的介面,而無需指定他們具體的類。
以下給出抽象工廠方法模式的uml圖:
回到《大話設計模式》裡面的雙資料庫訪問的例子:
namespace其實以上**就叫做抽象工廠模式了,當只有乙個user表的時候,就叫工廠方法模式。當有了多個表了,就叫抽象工廠模式。但是以上**是非常不好的,為什麼?例如當你還要增加乙個project表的時候,就需要增加三個類,iproject、sqlserverproject、accessproject,同時還需要更改ifactory、sqlserve***ctory、accessfactory。增加一張表就要更改三個類,這個是比較悲劇的。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
} }
因此,以下給出乙個用簡單工廠模式來優化抽象工廠模式的**:
namespace經過簡單工廠模式優化之後,客戶端就不再依賴於sqlserve***ctory或accessfactory了,帶到了解耦的目的。如果要新增乙個project,只需要新增響應類,但改就只需要修改dataaccess就可以了(在dataaccess裡面在新增乙個簡單工廠)。很明顯者不是最終方案,因為簡單工廠方法還是要修改,switch case。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
} }
以下還有通過反射實現的更加好的方案:
namespaceset
}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"在以上的**中,要增加乙個project表的話,只需要新增三個project相關的類(擴充套件),再修改dataaccess,在其中增加乙個createproject()方法就可以了。?>
<
configuration
>
<
>
<
add
key="db"
value
="access"
/>
>
configuration
>
設計模式學習 抽象工廠模式
抽象工廠模式,提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。抽象工廠模式的優點與缺點 優點 易於交換產品系列,由於具體工廠類在乙個應用中只需要在初始化的時候出現一次,這樣使得改變乙個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置。它讓具體的建立例項過程與...
設計模式學習 抽象工廠模式
模式概述 提供乙個建立一系列相關或相互依賴物件的介面,而無需制定它們具體的類,抽象工廠 abstract factory 模式又稱為kit模式,屬於物件建立型模式。抽象工廠模式與工廠方法模式最大的區別在於 工廠方法模式針對的是乙個產品等級結構,而抽象工廠模式則針對的是多個產品等級結構。所以在抽象工廠...
設計模式 工廠模式 抽象工廠模式
建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...