簡單工廠模式和工廠方法模式的區(qū)別
簡單工廠模式的最大優(yōu)點在于工廠類中包含了必要的邏輯判斷,根據(jù)客戶端的選擇條件動態(tài)實例化相關(guān)的類,對于客戶端來說,去除了于具體產(chǎn)品的依賴。而工廠方法模式定義了一個用于創(chuàng)建對象的借口,讓子類決定實例化哪一個類,工廠方法是一個類的實例化延遲到其子類。其實多做一些聯(lián)系不難發(fā)現(xiàn):工廠方法模式實現(xiàn)時,客戶端需要決定實例化那個工廠來實現(xiàn)運算類,選擇判斷的問題還是存在的,也即是說,工廠方法吧簡單工廠的內(nèi)部邏輯判斷移到了客戶端代碼來進行,我想要加一些功能,本來是需要修改工廠類的,但是現(xiàn)在我們只需要修改客戶端即可。下面是我們老師通過一個項目來簡單的分析工廠模式的區(qū)別,我大致整理了一下,寫的不好,只作為參考哦。
現(xiàn)在我們在開發(fā)一些web項目或者WInform項目時,我們都要數(shù)據(jù)庫來管理所有的信息,現(xiàn)在就以我開發(fā)的一個系統(tǒng)《隴原商城》為例,假如我的系統(tǒng)投入使用了,假如我用的數(shù)據(jù)庫就是Access數(shù)據(jù)庫,但是,過了一段時間,由于隴原商城貨買的非常好,Access數(shù)據(jù)庫已近不能滿足客戶的需求了,這時候客戶想換成Sql Server數(shù)據(jù)庫,這樣的話,我們又必須重新編寫代碼,重新?lián)Q成Sql Server數(shù)據(jù)庫來實現(xiàn),假如又過了一段時間,Sql Server數(shù)據(jù)庫也不能滿足用戶的的需求,這時候用戶又想換成Oracel數(shù)據(jù)庫來實現(xiàn)呢,到這里就不說了,可能我們開發(fā)人員就帶吐血啊,這樣就引起來我們的深思,我們怎么樣做一個系統(tǒng)可以讓我們不在那么麻煩的修改代碼呢?這就涉及到設計模式了,所以就出現(xiàn)了工廠方法模式,下面用工廠方法模式做一個小實驗來實現(xiàn)這樣的一個過程。
新建一個控制臺應用程序,命名為FactoryMethodPattern,在控制臺中添加一個IProductDAL接口,在里面定義一個方法,實現(xiàn)如下:
復制代碼 代碼如下:
namespace FactoryMethodPattern
{
public interface IProductDAL
{
void Insert();
}
}
然后新建接口實現(xiàn)工廠模式IProductDALFactory,實現(xiàn)如下:
復制代碼 代碼如下:
namespace FactoryMethodPattern
{
public interface IProductDALFactory
{
IProductDAL CreateProductDAL();
}
}
接下來在項目中添加類AccessProductDAL,繼承自接口IProductDAL,實現(xiàn)的方法是向控制臺輸出一條信息,實現(xiàn)如下:
復制代碼 代碼如下:
namespace FactoryMethodPattern
{
public class AccessProductDAL:IProductDAL
{
#region IProductDAL 成員
public void Insert()
{
Console.WriteLine("AccessProductDAL.Insert");
}
#endregion
}
}
然后創(chuàng)建一個AccessProductDAL的工廠類,使他繼承自IProductDALFactory接口,創(chuàng)建一個方法使其它的返回值為IProductDAL,最后在方法的實現(xiàn)里面返回實例化的AccessProductDAL,實現(xiàn)代碼如下:
復制代碼 代碼如下:
namespace FactoryMethodPattern
{
public class AccessProductDALFactory:IProductDALFactory
{
#region IProductDALFactory 成員
public IProductDAL CreateProductDAL()
{
return new AccessProductDAL();
}
#endregion
}
}
接下來寫一下:實現(xiàn)Sql Server數(shù)據(jù)庫的方法,添加一個類SqlProductDAL,使其方法輸出一句話
復制代碼 代碼如下:
namespace FactoryMethodPattern
{
public class SqlProductDAL:IProductDAL
{
#region IProductDAL 成員
public void Insert()
{
Console.WriteLine("SqlProductDAL.Insert");
}
#endregion
}
}
再添加SqlProductDALFactory類,實現(xiàn)代碼如下:
復制代碼 代碼如下:
namespace FactoryMethodPattern
{
public class SqlProductDALFactory:IProductDALFactory
{
#region IProductDALFactory 成員
public IProductDAL CreateProductDAL()
{
return new SqlProductDAL();
}
#endregion
}
}
接下來添加App.config文件,來實現(xiàn)系統(tǒng)所選擇的數(shù)據(jù)庫是什么數(shù)據(jù)庫,代碼如下:
復制代碼 代碼如下:
?xml version="1.0" encoding="utf-8" ?>
configuration>
appSettings>
add key="DALFactory" value="FactoryMethodPattern.SqlProductDALFactory"/>
/appSettings>
/configuration>
在寫業(yè)務邏輯層BLL,利用反射獲取app.config中所選擇的路徑是什么。讀取出來
代碼如下:
復制代碼 代碼如下:
namespace FactoryMethodPattern
{
public class BLL
{
public void Insert()
{
//利用反射實現(xiàn)功能
IProductDALFactory factory =(IProductDALFactory) Assembly.GetExecutingAssembly().CreateInstance(ConfigurationManager.AppSettings["DALFactory"]);
IProductDAL pro = factory.CreateProductDAL();
pro.Insert();
}
}
}
最后在program里面讀取BLL層信息,輸出信息
復制代碼 代碼如下:
namespace FactoryMethodPattern
{
class Program
{
static voidMain(string[] args)
{
BLL product = new BLL();
product.Insert();
Console.ReadKey();
}
}
}
最后單擊運行顯示的輸出信息為:
現(xiàn)在這個小系統(tǒng)整體就完成了,現(xiàn)在我要加入Oracel數(shù)據(jù)庫呢?我只要在寫兩個Oracel數(shù)據(jù)庫的類加到里面,再在app.config中修改一下路徑就OK了。
- 總結(jié):工廠方法克服了簡單工廠違背開放-封閉原則的缺點,有保持了封裝對象創(chuàng)建過程的優(yōu)點,工廠方法模式是簡單工廠模式的進一步抽象和推廣,由于使用了多態(tài)性,工廠方法模式保持了了簡單工廠模式的優(yōu)點,而且克服了它的缺點。
您可能感興趣的文章:- .NET簡單工廠模式講解
- 淺析.net簡單工廠模式
- JS面向?qū)ο蠡A(chǔ)講解(工廠模式、構(gòu)造函數(shù)模式、原型模式、混合模式、動態(tài)原型模式)
- Android源碼學習之工廠方法模式應用及優(yōu)勢介紹
- 深入c#工廠模式的詳解
- PHP 工廠模式使用方法
- javascript 模式設計之工廠模式學習心得
- C++設計模式之簡單工廠模式實例
- JavaScript 模式之工廠模式(Factory)應用介紹
- .NET工廠方法模式講解