深入c#工廠模式的詳解
更新時(shí)間:2013年05月22日 15:52:55 作者:
本篇文章是對(duì)c#中的工廠模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
什么是工廠模式?
類比生活中的概念,當(dāng)我們需要打電話的時(shí)候,我們需要一部手機(jī),我們通常會(huì)選擇直接去賣手機(jī)的實(shí)體店買。但在程序設(shè)計(jì)中,當(dāng)我們需要調(diào)用一個(gè)類(PhoneA或PhoneB)的方法的時(shí)候,我們往往還要關(guān)心他是怎么new出來的(見代碼段1)。這就好比我們自己還要去工廠里面告訴他們你要怎么生產(chǎn)出一部我需要的手機(jī)。而我們只關(guān)心他能不能打電話,你怎么做的關(guān)我屁事。所以這就有了工廠模式。工廠模式其實(shí)就是抽象出一個(gè)工廠,我需要什么手機(jī),去哪個(gè)工廠買就行了。我不必關(guān)心他的制作過程,你只要能生產(chǎn)我要的功能的手機(jī)就行。所以我們需要引入簡(jiǎn)單工廠,讓我們不用再關(guān)心手機(jī)怎么生產(chǎn)的,具體代碼的實(shí)現(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()
{
// 工廠決定到底實(shí)例化哪個(gè)子類。
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:簡(jiǎn)單工廠模式的實(shí)現(xiàn)
[TestMethod]
public void Test()
{
Factory factory = new Factory();
IProduct phone = factory.Create();
Assert.AreEqual<Type>(phone.GetType(), typeof(PhoneA));
}
代碼段3:對(duì)簡(jiǎn)單工廠模式的測(cè)試
新的問題
其實(shí)剛剛也提到了,我們只要一只能打電話的手機(jī),我就想去實(shí)體店買一下,我才不關(guān)心是哪個(gè)工廠生產(chǎn)的呢~而在簡(jiǎn)單工廠中,我們還需要關(guān)心是哪個(gè)工廠生產(chǎn)的(見代碼段3)。所以我們?cè)诖a里面實(shí)現(xiàn)一個(gè)實(shí)體店,這樣我們就不用關(guān)心到底是哪個(gè)工廠生產(chǎn)的啦。所以我們需要引入抽象工廠,這樣我們只需要跟實(shí)體店打交道,不要再關(guān)心要去找什么工廠拿手機(jī)了。具體的實(shí)現(xiàn)見代碼段4.我們可以利用配置文件實(shí)現(xiàn)對(duì)工廠的選擇,對(duì)產(chǎn)品的選擇,因?yàn)楸疚牟幌胍肫渌母拍?,這里就不討論了。
namespace Example2
{
/// <summary>
/// 抽象的工廠類型特性描述
/// </summary>
public interface IFactory
{
IProduct Create(); // 每個(gè)工廠所需要具有的工廠方法——?jiǎng)?chuàng)建產(chǎn)品
}
/// <summary>
/// 實(shí)體工廠類型
/// </summary>
public class FactoryA : IFactory
{
public IProduct Create()
{
return new PhoneA();
}
}
/// <summary>
/// 實(shí)體工廠類型
/// </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的同時(shí),與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、工廠方法模式注重的是整體對(duì)象的創(chuàng)建方法
2、工廠方法的意圖非常明確,它把類的實(shí)例化過程延遲到子類,將new()的工作交給工廠 完成。同時(shí),增加一個(gè)抽象的工廠定義,解決一系列具有統(tǒng)一通用工廠方法的實(shí)體工廠問題。 在.NET 平臺(tái)中,我們可以借助配置、泛型和委托的方法在實(shí)現(xiàn)經(jīng)典模式目的的同時(shí),獲得工廠類型與客戶程序間更加松散的構(gòu)造過程。
類比生活中的概念,當(dāng)我們需要打電話的時(shí)候,我們需要一部手機(jī),我們通常會(huì)選擇直接去賣手機(jī)的實(shí)體店買。但在程序設(shè)計(jì)中,當(dāng)我們需要調(diào)用一個(gè)類(PhoneA或PhoneB)的方法的時(shí)候,我們往往還要關(guān)心他是怎么new出來的(見代碼段1)。這就好比我們自己還要去工廠里面告訴他們你要怎么生產(chǎn)出一部我需要的手機(jī)。而我們只關(guān)心他能不能打電話,你怎么做的關(guān)我屁事。所以這就有了工廠模式。工廠模式其實(shí)就是抽象出一個(gè)工廠,我需要什么手機(jī),去哪個(gè)工廠買就行了。我不必關(guān)心他的制作過程,你只要能生產(chǎn)我要的功能的手機(jī)就行。所以我們需要引入簡(jiǎn)單工廠,讓我們不用再關(guān)心手機(jī)怎么生產(chǎn)的,具體代碼的實(shí)現(xiàn)見代碼段2
復(fù)制代碼 代碼如下:
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)用類方法的方式
復(fù)制代碼 代碼如下:
using System;
namespace Example1
{
public interface IProduct { }
public class PhoneA : IProduct { }
public class PhoneB : IProduct { }
public class Factory
{
public IProduct Create()
{
// 工廠決定到底實(shí)例化哪個(gè)子類。
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:簡(jiǎn)單工廠模式的實(shí)現(xiàn)
復(fù)制代碼 代碼如下:
[TestMethod]
public void Test()
{
Factory factory = new Factory();
IProduct phone = factory.Create();
Assert.AreEqual<Type>(phone.GetType(), typeof(PhoneA));
}
代碼段3:對(duì)簡(jiǎn)單工廠模式的測(cè)試
新的問題
其實(shí)剛剛也提到了,我們只要一只能打電話的手機(jī),我就想去實(shí)體店買一下,我才不關(guān)心是哪個(gè)工廠生產(chǎn)的呢~而在簡(jiǎn)單工廠中,我們還需要關(guān)心是哪個(gè)工廠生產(chǎn)的(見代碼段3)。所以我們?cè)诖a里面實(shí)現(xiàn)一個(gè)實(shí)體店,這樣我們就不用關(guān)心到底是哪個(gè)工廠生產(chǎn)的啦。所以我們需要引入抽象工廠,這樣我們只需要跟實(shí)體店打交道,不要再關(guān)心要去找什么工廠拿手機(jī)了。具體的實(shí)現(xiàn)見代碼段4.我們可以利用配置文件實(shí)現(xiàn)對(duì)工廠的選擇,對(duì)產(chǎn)品的選擇,因?yàn)楸疚牟幌胍肫渌母拍?,這里就不討論了。
復(fù)制代碼 代碼如下:
namespace Example2
{
/// <summary>
/// 抽象的工廠類型特性描述
/// </summary>
public interface IFactory
{
IProduct Create(); // 每個(gè)工廠所需要具有的工廠方法——?jiǎng)?chuàng)建產(chǎn)品
}
/// <summary>
/// 實(shí)體工廠類型
/// </summary>
public class FactoryA : IFactory
{
public IProduct Create()
{
return new PhoneA();
}
}
/// <summary>
/// 實(shí)體工廠類型
/// </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的同時(shí),與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、工廠方法模式注重的是整體對(duì)象的創(chuàng)建方法
2、工廠方法的意圖非常明確,它把類的實(shí)例化過程延遲到子類,將new()的工作交給工廠 完成。同時(shí),增加一個(gè)抽象的工廠定義,解決一系列具有統(tǒng)一通用工廠方法的實(shí)體工廠問題。 在.NET 平臺(tái)中,我們可以借助配置、泛型和委托的方法在實(shí)現(xiàn)經(jīng)典模式目的的同時(shí),獲得工廠類型與客戶程序間更加松散的構(gòu)造過程。
相關(guān)文章
C# 實(shí)現(xiàn)特殊字符快速轉(zhuǎn)碼
這篇文章主要介紹了C# 實(shí)現(xiàn)特殊字符快速轉(zhuǎn)碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01