深入c#工廠模式的詳解
更新時間:2013年05月22日 15:52:55 作者:
本篇文章是對c#中的工廠模式進行了詳細的分析介紹,需要的朋友參考下
什么是工廠模式?
類比生活中的概念,當我們需要打電話的時候,我們需要一部手機,我們通常會選擇直接去賣手機的實體店買。但在程序設(shè)計中,當我們需要調(diào)用一個類(PhoneA或PhoneB)的方法的時候,我們往往還要關(guān)心他是怎么new出來的(見代碼段1)。這就好比我們自己還要去工廠里面告訴他們你要怎么生產(chǎn)出一部我需要的手機。而我們只關(guān)心他能不能打電話,你怎么做的關(guān)我屁事。所以這就有了工廠模式。工廠模式其實就是抽象出一個工廠,我需要什么手機,去哪個工廠買就行了。我不必關(guān)心他的制作過程,你只要能生產(chǎn)我要的功能的手機就行。所以我們需要引入簡單工廠,讓我們不用再關(guān)心手機怎么生產(chǎn)的,具體代碼的實現(xiàn)見代碼段2
public class Customer
{
public void CallSomeOne(){
PhoneA p1 = new PhoneA();
p1.Call();
}
}
public class PhoneA
{
public void Call(){}
}
public class PhoneB
{
public void Call(){}
}
代碼段1 :通常的調(diào)用類方法的方式
using System;
namespace Example1
{
public interface IProduct { }
public class PhoneA : IProduct { }
public class PhoneB : IProduct { }
public class Factory
{
public IProduct Create()
{
// 工廠決定到底實例化哪個子類。
return new PhonetA ();
}
}
}
using System;
namespace Example1
{
public enum Category
{
A,
}
public static class ProductFactory
{
public static IProduct Create(Category category)
{
switch (category)
{
case Category.A:
return new PhoneA();
case Category.B:
return new PhoneB();
default:
throw new NotSupportedException();
}
}
}
}
代碼段2:簡單工廠模式的實現(xiàn)
[TestMethod]
public void Test()
{
Factory factory = new Factory();
IProduct phone = factory.Create();
Assert.AreEqual<Type>(phone.GetType(), typeof(PhoneA));
}
代碼段3:對簡單工廠模式的測試
新的問題
其實剛剛也提到了,我們只要一只能打電話的手機,我就想去實體店買一下,我才不關(guān)心是哪個工廠生產(chǎn)的呢~而在簡單工廠中,我們還需要關(guān)心是哪個工廠生產(chǎn)的(見代碼段3)。所以我們在代碼里面實現(xiàn)一個實體店,這樣我們就不用關(guān)心到底是哪個工廠生產(chǎn)的啦。所以我們需要引入抽象工廠,這樣我們只需要跟實體店打交道,不要再關(guān)心要去找什么工廠拿手機了。具體的實現(xiàn)見代碼段4.我們可以利用配置文件實現(xiàn)對工廠的選擇,對產(chǎn)品的選擇,因為本文不想引入其他的概念,這里就不討論了。
namespace Example2
{
/// <summary>
/// 抽象的工廠類型特性描述
/// </summary>
public interface IFactory
{
IProduct Create(); // 每個工廠所需要具有的工廠方法——創(chuàng)建產(chǎn)品
}
/// <summary>
/// 實體工廠類型
/// </summary>
public class FactoryA : IFactory
{
public IProduct Create()
{
return new PhoneA();
}
}
/// <summary>
/// 實體工廠類型
/// </summary>
public class FactoryB : IFactory
{
public IProduct Create()
{
return new PhoneB();
}
}
}
using System;
using System.Diagnostics;
namespace Example2
{
class Client
{
public void SomeMethod()
{
IFactory factory = new FactoryA(); // 獲得了抽象Factory的同時,與FactoryA產(chǎn)生依賴;
IProduct Phone = factory.Create(); // 后續(xù)操作僅以來抽象的IFactory和IProduct完成
// ...
}
private IFactory factory;
public Client(IFactory factory) // 將IFactory通過Setter方式注入
{
if (factory == null) throw new ArgumentNullException("factory");
this.factory = factory;
}
public void AnotherMethod()
{
IProduct Phone = factory.Create();
// ... ...
}
}
}
小結(jié)
1、工廠方法模式注重的是整體對象的創(chuàng)建方法
2、工廠方法的意圖非常明確,它把類的實例化過程延遲到子類,將new()的工作交給工廠 完成。同時,增加一個抽象的工廠定義,解決一系列具有統(tǒng)一通用工廠方法的實體工廠問題。 在.NET 平臺中,我們可以借助配置、泛型和委托的方法在實現(xiàn)經(jīng)典模式目的的同時,獲得工廠類型與客戶程序間更加松散的構(gòu)造過程。
類比生活中的概念,當我們需要打電話的時候,我們需要一部手機,我們通常會選擇直接去賣手機的實體店買。但在程序設(shè)計中,當我們需要調(diào)用一個類(PhoneA或PhoneB)的方法的時候,我們往往還要關(guān)心他是怎么new出來的(見代碼段1)。這就好比我們自己還要去工廠里面告訴他們你要怎么生產(chǎn)出一部我需要的手機。而我們只關(guān)心他能不能打電話,你怎么做的關(guān)我屁事。所以這就有了工廠模式。工廠模式其實就是抽象出一個工廠,我需要什么手機,去哪個工廠買就行了。我不必關(guān)心他的制作過程,你只要能生產(chǎn)我要的功能的手機就行。所以我們需要引入簡單工廠,讓我們不用再關(guān)心手機怎么生產(chǎn)的,具體代碼的實現(xiàn)見代碼段2
復制代碼 代碼如下:
public class Customer
{
public void CallSomeOne(){
PhoneA p1 = new PhoneA();
p1.Call();
}
}
public class PhoneA
{
public void Call(){}
}
public class PhoneB
{
public void Call(){}
}
代碼段1 :通常的調(diào)用類方法的方式
復制代碼 代碼如下:
using System;
namespace Example1
{
public interface IProduct { }
public class PhoneA : IProduct { }
public class PhoneB : IProduct { }
public class Factory
{
public IProduct Create()
{
// 工廠決定到底實例化哪個子類。
return new PhonetA ();
}
}
}
using System;
namespace Example1
{
public enum Category
{
A,
}
public static class ProductFactory
{
public static IProduct Create(Category category)
{
switch (category)
{
case Category.A:
return new PhoneA();
case Category.B:
return new PhoneB();
default:
throw new NotSupportedException();
}
}
}
}
代碼段2:簡單工廠模式的實現(xiàn)
復制代碼 代碼如下:
[TestMethod]
public void Test()
{
Factory factory = new Factory();
IProduct phone = factory.Create();
Assert.AreEqual<Type>(phone.GetType(), typeof(PhoneA));
}
代碼段3:對簡單工廠模式的測試
新的問題
其實剛剛也提到了,我們只要一只能打電話的手機,我就想去實體店買一下,我才不關(guān)心是哪個工廠生產(chǎn)的呢~而在簡單工廠中,我們還需要關(guān)心是哪個工廠生產(chǎn)的(見代碼段3)。所以我們在代碼里面實現(xiàn)一個實體店,這樣我們就不用關(guān)心到底是哪個工廠生產(chǎn)的啦。所以我們需要引入抽象工廠,這樣我們只需要跟實體店打交道,不要再關(guān)心要去找什么工廠拿手機了。具體的實現(xiàn)見代碼段4.我們可以利用配置文件實現(xiàn)對工廠的選擇,對產(chǎn)品的選擇,因為本文不想引入其他的概念,這里就不討論了。
復制代碼 代碼如下:
namespace Example2
{
/// <summary>
/// 抽象的工廠類型特性描述
/// </summary>
public interface IFactory
{
IProduct Create(); // 每個工廠所需要具有的工廠方法——創(chuàng)建產(chǎn)品
}
/// <summary>
/// 實體工廠類型
/// </summary>
public class FactoryA : IFactory
{
public IProduct Create()
{
return new PhoneA();
}
}
/// <summary>
/// 實體工廠類型
/// </summary>
public class FactoryB : IFactory
{
public IProduct Create()
{
return new PhoneB();
}
}
}
using System;
using System.Diagnostics;
namespace Example2
{
class Client
{
public void SomeMethod()
{
IFactory factory = new FactoryA(); // 獲得了抽象Factory的同時,與FactoryA產(chǎn)生依賴;
IProduct Phone = factory.Create(); // 后續(xù)操作僅以來抽象的IFactory和IProduct完成
// ...
}
private IFactory factory;
public Client(IFactory factory) // 將IFactory通過Setter方式注入
{
if (factory == null) throw new ArgumentNullException("factory");
this.factory = factory;
}
public void AnotherMethod()
{
IProduct Phone = factory.Create();
// ... ...
}
}
}
小結(jié)
1、工廠方法模式注重的是整體對象的創(chuàng)建方法
2、工廠方法的意圖非常明確,它把類的實例化過程延遲到子類,將new()的工作交給工廠 完成。同時,增加一個抽象的工廠定義,解決一系列具有統(tǒng)一通用工廠方法的實體工廠問題。 在.NET 平臺中,我們可以借助配置、泛型和委托的方法在實現(xiàn)經(jīng)典模式目的的同時,獲得工廠類型與客戶程序間更加松散的構(gòu)造過程。