簡單工廠模式和策略模式的區別

2021-06-28 17:41:36 字數 3549 閱讀 6356

最近一直在抽時間研究設計模式,之前對設計模式也有一定的了解,但是都沒有平心靜氣的去研究過,只是了解了一些皮毛,最近打算再深入研究一下,重新開啟了設計模式的資料,對之前的疑問乙個個的刨根問底,今天看了簡單工廠模式和策略模式看的人有點小暈,兩個的大概思路沒有怎麼變,都是通過多型去減少**的耦合度,怎麼看兩個都是如出一轍,最後終於找到了兩個的本質區別,在此和大家分享下:

先上**:

簡單工廠模式:

// 抽象類  

abstract class absclass

// 繼承自抽象類

class a:absclass

} // 繼承自抽象類

class b:absclass

} // 現金收取工廠

class cashfactory

return cs;

} }

客戶端呼叫:

// 利用簡單工廠模式根據下拉選擇框,生成相應的物件

absclass csuper = cashfactory.createcashaccept("a");

csuper.acceptcash();

策略模式:

前面的類沒有任何變化,只是把factory變成了cashcontext策略類

//策略context

class cashcontext

//得到現金**計算結果(利用了多型機制,不同的策略行為導致不同的結果)

public double getresult(double money)

}

客戶端呼叫:

absclass cc = null;

switch (cbxtype.selecteditem.tostring())

cc.getresult(...);

簡單概括總結一下:

策略模式和簡單工廠模式看起來非常相似,都是通過多型來實現不同子類的選取,這種思想應該是從程式的整體來看得出的。如果從使用這兩種模式的角度來看的話,我們會發現:

在簡單工廠模式中,客戶端只需要傳遞相應的條件就能得到想要的乙個物件,然後通過這個物件實現演算法的操作。

而策略模式,客戶端必須首先建立乙個想使用的類物件,然後將該物件作為引數傳遞進去,通過該物件呼叫不同的演算法。

在簡單工廠模式中實現了通過條件選取乙個類去例項化物件,策略模式則將選取相應物件的工作交給模式的使用者,它本身不去做選取工作。

名詞理解:

工廠(factory)模式我們可以做如下理解,假設有乙個audi的公司生產汽車(似乎也不用假設了),它掌握一項核心的技術就是生產汽車,另一方面,它生產的汽車是有不同型號的,並且在

不同的生產線上進行組裝。當客戶通過銷售部門進行預定後,audi公司將在指定的生產線上為客戶生產出它所需要的汽車。

策略(strategy)模式在結構上與工廠模式類似,唯一的區別是工廠模式例項化乙個產品的操作是在服務端來做的,換句話說客戶端傳達給服務端的只是某種標識,服務端根據該標識例項化乙個物件。而策略模式的客戶端傳達給服務端的是乙個例項,服務端只是將該例項拿過去在服務端的環境裡執行該例項的方法。這就好比乙個對汽車不甚了解的人去買車,他在那一比劃,說要什麼什麼樣的,銷售部門根據他的這個「比劃」來形成乙份訂單,這就是工廠模式下的工作方式。而策略模式下那個顧客就是個行家,他自己給出了訂單的詳細資訊,銷售部門只是轉了一下手就交給生產部門去做了。

通過兩相對比,我們不難發現:

採用工廠模式必須提供足夠靈活的銷售部門,如果使用者有了新的需求,銷售部門必須馬上意識到這樣才可以做出合適的訂單。所以倘一款新車出來了,生產部門和銷售部門都需要更新,對顧客來說也需要更新對新車的描述,所以需要改動的地方有三處

而策略模式中的銷售部門工作比較固定,它只負責接受訂單並執行特定的幾個操作。當一款新車出來時,只需要對服務端的生產部門和客戶端的**進行更新,而不需要更新銷售部門的**。

技術支援:

簡單工廠和策略的基礎都是因為物件導向的封裝與多型。他們實現的思想都是先設定乙個抽象的模型並從該模型派生出符合不同客戶需求的各種方法,並加以封裝。

模型:audi公司的產品有a6, a4, tt, r8...我們如果將每種車的生產做乙個方法,那麼我們的模型結構應該是這樣的

public void createa6()

public void creatett()

}}

設想一下如果audi出了一款新車,那麼我們必須要在audi這個類裡邊新增新的方法,這就要求總公司提供對audi這個類的修改許可權,如果新車專案的負責人對其他車型的負責人有什麼意見,

它可以輕而易舉的改亂他們的**,

讓他們的工作陷入癱瘓(當然現實中沒有人會這麼幹)。我們的目標是新生產線的專案負責人只有許可權對自己的專案情況作出修改,除此之外他一無所知。

我們可以考慮如下的模型結構:

class a6factory : basefactory

}class a4factory : basefactory

}class ttfactory : basefactory

}class r8factory : basefactory

}class selectca***ctorypattern}}

class selectcarstrategypattern

public void ordercar()

}}

這種結構的好處是將每一條生產線進行了封裝,在必要的情況下可以使他們的源**在彼此之間不可見,這一點正是我們所希望看到的。
另外如果每條生產線涉及的**量很大,

這種結構也可以避免重複編譯,我們只需要對新增加的生產線進行編譯,而之前的生產線我們甚至連動都不需要動。到目前為止,簡單工廠模式和策略模式沒有什麼區別。

工廠模式和策略模式的區別在於例項化乙個物件的位置不同,對工廠模式而言,例項化物件是放在服務端的,下面這個類就是用來做這個的。
class selectca***ctorypattern

}}

而策略模式例項化物件的操作在客戶端,服務端的「銷售部門」只負責傳遞該物件,並在服務端的環境裡執行特定的操作。正如下面這個類所做的:
class selectcarstrategypattern

public void ordercar()

}

下面是服務端在兩種模式下例項化乙個物件並進行操作的示例,工廠模式要求服務端的銷售部門足夠靈敏,而策略模式由於對策略進行了封裝,所以他的銷售部門比較傻,需要客戶提供足夠能區分使用哪種策略的引數,而這最好的就是該策略的例項了
}}

簡單工廠模式和策略模式的區別

而下面是我的理解 按一般教程中出現的例子理解 簡單工廠模式 客戶端傳乙個條件進工廠類,工廠類根據條件建立相應的產品類物件,並return給客戶端,供客戶端使用。即客戶端使用的是工廠類生產的產品物件。策略模式 客戶端建立乙個context類物件a 可以看作是工廠模式中工廠類 建立乙個策略物件並傳參給物...

簡單工廠模式和策略模式的區別

按一般教程中出現的例子理解 簡單工廠模式 客戶端傳乙個條件進工廠類,工廠類根據條件建立相應的產品類物件,並return給客戶端,供客戶端使用。即客戶端使用的是工廠類生產的產品物件。策略模式 客戶端建立乙個context類物件a 可以看作是工廠模式中工廠類 建立乙個策略物件並傳參給物件a,然後客戶端使...

簡單工廠模式和策略模式的區別

首先看一下簡單工廠類和策略模式 context 類中 的區別 簡單工廠類 現金收費工廠類 class cashfactory return cs 客戶端程式主要部分 double total 0.0d private void button1 click object sender,eventarg...