更新時(shí)間:2022-05-19 09:47:24 來源:動力節(jié)點(diǎn) 瀏覽1379次
設(shè)計(jì)模式是為重復(fù)性和典型項(xiàng)目問題提供解決方案的現(xiàn)成描述。
它們是經(jīng)驗(yàn)、辛勤工作和大量試驗(yàn)和錯誤的結(jié)果。它們還代表了面向?qū)ο缶幊痰纳钏际鞈]和最佳實(shí)踐(SOLID、DRY、KISS和YAGNI)。這些模式成為程序員之間交流的一個(gè)元素,它們是每個(gè)工程師入門的一個(gè)元素。
一般來說,設(shè)計(jì)模式只不過是重復(fù)問題的演練,值得寫下來和理解。值得注意的是,設(shè)計(jì)模式并不建議直接實(shí)現(xiàn)解決方案,而只是一個(gè)結(jié)構(gòu)的輪廓,其中包含一些應(yīng)該適應(yīng)我們需求的特征方面。
想象一下,一位程序員同事試圖向您解釋小部件和通過 SOAP 通信的類之間的流是如何工作的。
值得注意的是,設(shè)計(jì)模式并沒有同質(zhì)的劃分,而且通常與該主題的研究一樣多。
創(chuàng)造模式
結(jié)構(gòu)圖案
行為模式
每種設(shè)計(jì)模式都適用于確定的情況。在不恰當(dāng)?shù)那闆r下使用它們可能弊大于利!
在本文中,我們將限制自己選擇的模式。
創(chuàng)建模式與創(chuàng)建對象的控制機(jī)制相關(guān)聯(lián)。形成對象的基本模式在某些項(xiàng)目中可能存在問題,并可能導(dǎo)致某些領(lǐng)域不必要的復(fù)雜性。創(chuàng)建模式應(yīng)該防止出現(xiàn)問題并引入對創(chuàng)建對象的更多控制。他們的任務(wù)是將對象的創(chuàng)建、完成和表示過程分開。
有五種眾所周知的設(shè)計(jì)模式可以在廣泛的編程語言中實(shí)現(xiàn):
抽象工廠模式
建造者模式
工廠方法模式
原型模式
單例模式
在本文中,我們將仔細(xì)研究工廠方法和單例方法。
單例模式最多提供給定類的一個(gè)實(shí)例和對其引用的全局訪問。由于它違反了兩個(gè) SOLID 規(guī)則(單一責(zé)任原則和開放/封閉原則),因此經(jīng)常被呈現(xiàn)為反模式,有時(shí)它被過度使用并且經(jīng)常被視為全局變量的對象替代品。在多線程環(huán)境中實(shí)現(xiàn)時(shí)也碰巧有問題。
如果您的應(yīng)用程序需要對同一資源進(jìn)行全局訪問,請使用此模式。

您可以在下面找到 CiviCRM 3.4 中單例的示例性實(shí)現(xiàn):
_session = & $ _SESSION ;
$這個(gè)->創(chuàng)建();
}
靜態(tài)函數(shù)&單例()
{
if ( self :: $ _singleton === null ) {
自我:: $ _singleton =新CRM_Core_Session ;
}
返回自我:: $ _singleton ;
}
// 其他方法
}
工廠方法模式是最著名的設(shè)計(jì)模式之一。
它的任務(wù)是向客戶端隱藏創(chuàng)建對象的細(xì)節(jié),同時(shí)提供生成它們的接口。實(shí)現(xiàn)接口的類決定創(chuàng)建對象的類。
客戶端期望接口或抽象類的安全實(shí)現(xiàn),但對特定實(shí)現(xiàn)不感興趣。然而,程序員可以很容易地用額外的對象類擴(kuò)展工廠的產(chǎn)品組合。
在設(shè)計(jì)您的應(yīng)用程序時(shí),值得考慮的是應(yīng)用程序是否真的需要目標(biāo)工廠。如果一個(gè)產(chǎn)品有許多具有相似基類的類,并且您在接口或抽象類中操作對象,那么工廠方法模式肯定會很有用。

抽象工廠模式更進(jìn)一步,向更高層次的抽象移動(因此得名)。在這種情況下,客戶不知道使用什么樣的工廠。抽象工廠提供了一個(gè)用于創(chuàng)建客戶端使用的依賴對象組的接口,但沒有給出它們的確切實(shí)現(xiàn)。
對于用戶自定義接口可用的特定產(chǎn)品的創(chuàng)建,通常使用基于工廠方法模式或原型模式的工廠(這里不討論)。
工廠方法模式和抽象工廠模式之間的主要區(qū)別在于,在前者中,客戶收到一個(gè)產(chǎn)品,而在后者中,客戶收到整個(gè)產(chǎn)品組。
下圖將有助于理解抽象工廠的概念:
/ **
抽象的第一類實(shí)現(xiàn)
* /
抽象類AbstProduct1 {
公共抽象無效動作();
}
類Product1A擴(kuò)展AbstProduct1 {
Product1A (字符串參數(shù)){
系統(tǒng)。出來。println ( "我" + arg );
}
公共無效動作(){ };
}
類Product1B擴(kuò)展AbstProduct1 {
ProductA2 (字符串參數(shù)){
系統(tǒng)。出來。println ( "我" + arg );
}
公共無效動作(){ };
}
/ **
抽象的二等實(shí)現(xiàn)
* /
抽象類AbstProduct2 {
}
類Product2A擴(kuò)展AbstProduct2 {
Product2A (字符串參數(shù)){
系統(tǒng)。出來。println ( "我" + arg );
}
}
類Product2B擴(kuò)展AbstProduct2 {
ProductB2 (字符串參數(shù)){
系統(tǒng)。出來。println ( "我" + arg );
}
}
/ **
抽象工廠實(shí)現(xiàn)
* /
抽象類AbstractFactory {
抽象AbstProduct1 createProduct1 ();
抽象AbstProduct2 createProduct2 ();
}
類FactoryA擴(kuò)展AbstractFactory {
AbstProduct1 createProduct1 () {
返回新的Product1A (“Product1A” );
}
AbstProduct2 createProduct2 () {
返回新的Product2A (“Product2A” );
}
}
類FactoryB擴(kuò)展AbstractFactory {
AbstProduct1 createProduct1 () {
返回新的Product1B ( "Product1B" );
}
AbstProduct2 createProduct2 () {
返回新的Product2B (“Product2B” );
}
}
// 一些工廠操作
類FactoryMaker {
私有靜態(tài)AbstractFactory pf = null ;
靜態(tài)AbstractFactory getFactory (字符串選擇){
如果(選擇。等于(“a” )){
pf =新工廠A ();
} else if (選擇.等于( "b" )) {
pf =新工廠 B ();
}返回pf ;
}
}
// 客戶端
公共類ClientApp {
公共靜態(tài)無效主要(字符串參數(shù)[]){
AbstractFactory pf = FactoryMaker 。獲取工廠(“一” );
AbstractProductA產(chǎn)品= pf 。創(chuàng)建產(chǎn)品1 ();
}
}
行為模式的任務(wù)是為與對象間通信相關(guān)的解決方案引入靈活性。它們專注于在通信對象之間分配特定的角色和職責(zé)。
這種模式是:
模式迭代器
觀察者模式
命令模式
策略模式
模板方法模式
這些模式最重要的特點(diǎn)是通過找到一種簡單的方法來實(shí)現(xiàn)實(shí)體之間的依賴關(guān)系,從而方便操作和設(shè)計(jì)應(yīng)用程序。由于這種模式,設(shè)計(jì)包含獨(dú)立類庫的應(yīng)用程序更容易。
以下結(jié)構(gòu)模式是最著名的結(jié)構(gòu)模式之一:
模式適配器
裝飾圖案
立面圖案
代理模式
復(fù)合圖案

初級 202925

初級 203221

初級 202629

初級 203743