asp.net 簡單原廠模式和Factory 方法模式之論述

來源:互聯網
上載者:User

簡單原廠模式和Factory 方法模式的區別
簡單原廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據用戶端的選擇條件動態執行個體化相關的類,對於用戶端來說,去除了於具體產品的依賴。而Factory 方法模式定義了一個用於建立對象的借口,讓子類決定執行個體化哪一個類,Factory 方法是一個類的執行個體化延遲到其子類。其實多做一些聯絡不難發現:Factory 方法模式實現時,用戶端需要決定執行個體化那個工廠來實現運算類,選擇判斷的問題還是存在的,也即是說,Factory 方法吧簡單工廠的內部邏輯判斷移到了用戶端代碼來進行,我想要加一些功能,本來是需要修改工廠類的,但是現在我們只需要修改用戶端即可。下面是我們老師通過一個項目來簡單的分析原廠模式的區別,我大致整理了一下,寫的不好,只作為參考哦。

現在我們在開發一些web項目或者WInform項目時,我們都要資料庫來管理所有的資訊,現在就以我開發的一個系統《隴原商城》為例,假如我的系統投入使用了,假如我用的資料庫就是Access資料庫,但是,過了一段時間,由於隴原商城貨買的非常好,Access資料庫已近不能滿足客戶的需求了,這時候客戶想換成Sql Server資料庫,這樣的話,我們又必須重新編寫代碼,重新換成Sql Server資料庫來實現,假如又過了一段時間,Sql Server資料庫也不能滿足使用者的的需求,這時候使用者又想換成Oracel資料庫來實現呢,到這裡就不說了,可能我們開發人員就帶吐血啊,這樣就引起來我們的深思,我們怎麼樣做一個系統可以讓我們不在那麼麻煩的修改代碼呢?這就涉及到設計模式了,所以就出現了Factory 方法模式,下面用Factory 方法模式做一個小實驗來實現這樣的一個過程。

建立一個控制台應用程式,命名為FactoryMethodPattern,在控制台中添加一個IProductDAL介面,在裡面定義一個方法,實現如下: 複製代碼 代碼如下:namespace FactoryMethodPattern
{
public interface IProductDAL
{
void Insert();
}
}

然後建立介面實現原廠模式IProductDALFactory,實現如下: 複製代碼 代碼如下:namespace FactoryMethodPattern
{
public interface IProductDALFactory
{
IProductDAL CreateProductDAL();
}
}

接下來在項目中添加類AccessProductDAL,繼承自介面IProductDAL,實現的方法是向控制台輸出一條資訊,實現如下: 複製代碼 代碼如下:namespace FactoryMethodPattern
{
public class AccessProductDAL:IProductDAL
{
#region IProductDAL 成員
public void Insert()
{
Console.WriteLine("AccessProductDAL.Insert");
}
#endregion
}
}

然後建立一個AccessProductDAL的工廠類,使他繼承自IProductDALFactory介面,建立一個方法使其它的傳回值為IProductDAL,最後在方法的實現裡面返回執行個體化的AccessProductDAL,實現代碼如下: 複製代碼 代碼如下:namespace FactoryMethodPattern
{
public class AccessProductDALFactory:IProductDALFactory
{
#region IProductDALFactory 成員
public IProductDAL CreateProductDAL()
{
return new AccessProductDAL();
}
#endregion
}
}

接下來寫一下:實現Sql Server資料庫的方法,添加一個類SqlProductDAL,使其方法輸出一句話 複製代碼 代碼如下:namespace FactoryMethodPattern
{
public class SqlProductDAL:IProductDAL
{
#region IProductDAL 成員
public void Insert()
{
Console.WriteLine("SqlProductDAL.Insert");
}
#endregion
}
}

再添加SqlProductDALFactory類,實現代碼如下: 複製代碼 代碼如下:namespace FactoryMethodPattern
{
public class SqlProductDALFactory:IProductDALFactory
{
#region IProductDALFactory 成員
public IProductDAL CreateProductDAL()
{
return new SqlProductDAL();
}
#endregion
}
}

接下來添加App.config檔案,來實現系統所選擇的資料庫是什麼資料庫,代碼如下: 複製代碼 代碼如下:<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="DALFactory" value="FactoryMethodPattern.SqlProductDALFactory"/>
</appSettings>
</configuration>

在寫商務邏輯層BLL,利用反射擷取app.config中所選擇的路徑是什麼。讀取出來
代碼如下: 複製代碼 代碼如下:namespace FactoryMethodPattern
{
public class BLL
{
public void Insert()
{
//利用反射實現功能
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();
}
}
}

最後單擊運行顯示的輸出資訊為:

現在這個小系統整體就完成了,現在我要加入Oracel資料庫呢?我只要在寫兩個Oracel資料庫的類加到裡面,再在app.config中修改一下路徑就OK了。

  1. 總結:Factory 方法克服了簡單工廠違背開放-封閉原則的缺點,有保持了封裝對象建立過程的優點,Factory 方法模式是簡單原廠模式的進一步抽象和推廣,由於使用了多態性,Factory 方法模式保持了了簡單原廠模式的優點,而且克服了它的缺點。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.