?〇、簡介
1、什么是簡單工廠模式?
一句話解釋:
??客戶類和工廠類嚴格分工,客戶類只需知道怎么用,處理邏輯交給工廠類。
簡單工廠模式(Simple Factory Pattern)是日常開發(fā)中常用的設(shè)計模式。其是一種簡單的創(chuàng)建型模式,它通過一個工廠類來創(chuàng)建對象,客戶端只需要知道如何使用工廠類,而不需要知道對象的實現(xiàn)細節(jié)。工廠類負責創(chuàng)建對象的整個生命周期,并且負責處理與具體實現(xiàn)有關(guān)的邏輯。
這種將變化邏輯和客戶端分離的方式,就是面向?qū)ο笾械摹胺庋b”特性了。
?一個比喻:(食堂與學生)
??比如一個食堂中午有各種面食,學生也就是客戶端,關(guān)心的是菜單想吃哪個就給直接說,不關(guān)心這份燜面或者燴面怎么做的,后廚就相當于工廠類,把控著制作的步驟。
2、優(yōu)缺點和使用場景
- 優(yōu)點:簡單工廠模式可以使客戶端代碼變得簡潔,同時隱藏對象的實現(xiàn)細節(jié)。
- 缺點:當需要增加新的運算類時,需要修改工廠類的代碼,這違反了開閉原則。此外,工廠類包含了一組相關(guān)對象的創(chuàng)建邏輯,這使得工廠類變得復雜,難以維護。
?使用場景舉例:
- 客戶端如果對于如何創(chuàng)建對象的邏輯不關(guān)心,且知道工廠類的入?yún)r,可以考慮使用簡單工廠模式。
- 當工廠類負責創(chuàng)建的對象比較少時可以考慮使用簡單工廠模式,因為比較多的話 case 太多維護起來較麻煩。
二、簡單工廠模式的簡單實現(xiàn)與比較
?如下代碼,是一個畫形狀的示例:
// 形狀接口,畫動作的方法
public interface IShape
{
void Draw();
}
public class Circle : IShape
{
public void Draw()
{
Console.WriteLine("畫圓:〇");
}
}
public class Rectangle : IShape
{
public void Draw()
{
Console.WriteLine("畫方:口");
}
}
public class ShapeFactory // 簡單工廠實現(xiàn)
{
public static IShape CreateShape(string shapeType)
{
switch (shapeType) // 當需要擴展時,就需要修改這里的 case 也是本模式的缺點所在
{
case "圓":
return new Circle();
case "方":
return new Rectangle();
default:
throw new ArgumentException("輸入形狀不支持!");
}
}
}
測試代碼:?
static void Main(string[] args)
{
// 簡單工廠模式寫法
IShape circle = ShapeFactory.CreateShape("圓"); // 把對象的創(chuàng)建交給工廠類
circle.Draw();
IShape rectangle = ShapeFactory.CreateShape("方");
rectangle.Draw();
// 不用簡單工廠模式的寫法
Circle circle = new Circle(); // 單個類實例化,把創(chuàng)建對象的工作放在了客戶端
circle.Draw();
Rectangle rectangle = new Rectangle();
rectangle.Draw();
}
結(jié)果是相同的:
???
三、在 .NET 框架中的實際應用
?.NET 中 System.Text.Encoding 類就實現(xiàn)了簡單工廠模式,該類中的 GetEncoding(int codepage) 就是工廠方法,具體的代碼可以通過 ILSpy 反編譯工具進行查看,下面就是該方法中的代碼:
// System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
// System.Text.Encoding
using System.Globalization;
public static Encoding GetEncoding(int codepage)
{
Encoding encoding = FilterDisallowedEncodings(EncodingProvider.GetEncodingFromProvider(codepage));
if (encoding != null)
{
return encoding;
}
switch (codepage)
{
case 0:
return Default;
case 1200:
return Unicode;
case 1201:
return BigEndianUnicode;
case 12000:
return UTF32;
case 12001:
return BigEndianUTF32;
case 65001:
return UTF8;
case 20127:
return ASCII;
case 28591:
return Latin1;
case 1:
case 2:
case 3:
case 42:
throw new ArgumentException(SR.Format(SR.Argument_CodepageNotSupported, codepage), "codepage");
case 65000:
{
if (LocalAppContextSwitches.EnableUnsafeUTF7Encoding)
{
return UTF7;
}
string p = string.Format(CultureInfo.InvariantCulture, "https://aka.ms/dotnet-warnings/{0}", "SYSLIB0001");
string message = SR.Format(SR.Encoding_UTF7_Disabled, p);
throw new NotSupportedException(message);
}
default:
if (codepage < 0 || codepage > 65535)
{
throw new ArgumentOutOfRangeException("codepage", SR.Format(SR.ArgumentOutOfRange_Range, 0, 65535));
}
throw new NotSupportedException(SR.Format(SR.NotSupported_NoCodepageData, codepage));
}
}
public abstract class Encoding : ICloneable
{
// 。。。
}
?由源碼可知,GetEncoding(int) 方法中,例舉了全部可用的編碼方式,客戶端這可以通過編碼 codepage 查詢目標編碼類型。
參考:https://www.cnblogs.com/zhili/p/SimpleFactory.html
四、簡單工廠、工廠方法和抽象工廠模式的關(guān)系
三者都屬于創(chuàng)建型設(shè)計模式,都關(guān)注對象的創(chuàng)建,但在實現(xiàn)方式和應用場景上有一些區(qū)別。
相同點:
- 都是創(chuàng)建對象的設(shè)計模式,將對象的實例化過程封裝起來。
- 通過使用這些模式,可以提供靈活性和可維護性,降低了代碼的耦合度。
區(qū)別:文章來源:http://www.zghlxwxcb.cn/news/detail-460078.html
- 簡單工廠(Simple Factory):由一個工廠類根據(jù)傳入的參數(shù)來決定創(chuàng)建哪種產(chǎn)品的實例??蛻舳酥恍枰c工廠類交互,不需要直接實例化具體產(chǎn)品。適用于創(chuàng)建單一類型的產(chǎn)品。優(yōu)點是簡單易懂,適用于只有少量產(chǎn)品的情況,但缺點是擴展性較差,添加新產(chǎn)品時需要修改工廠類。
- 工廠方法(Factory Method):定義一個創(chuàng)建產(chǎn)品的接口,由子類來決定具體實例化哪個產(chǎn)品??蛻舳送ㄟ^調(diào)用工廠方法來獲取產(chǎn)品實例。適用于創(chuàng)建一組相關(guān)或相似的產(chǎn)品。它通過使用繼承或?qū)崿F(xiàn)接口的方式來實現(xiàn)產(chǎn)品的創(chuàng)建,提供了更好的擴展性和靈活性,但也增加了代碼的復雜度。
- 抽象工廠(Abstract Factory):提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定其具體類??蛻舳送ㄟ^調(diào)用抽象工廠接口來創(chuàng)建一組相關(guān)的產(chǎn)品。適用于創(chuàng)建一系列相關(guān)的產(chǎn)品族。它在工廠模式的基礎(chǔ)上進一步抽象,將一系列相關(guān)的產(chǎn)品組成一個產(chǎn)品族,能夠方便地創(chuàng)建一組相關(guān)對象。同樣也增加了系統(tǒng)的復雜度。
簡單工廠模式適用于只有少量產(chǎn)品且不經(jīng)常變動的情況,而工廠方法模式和抽象工廠模式適用于需要創(chuàng)建多個相關(guān)或相似產(chǎn)品的情況。文章來源地址http://www.zghlxwxcb.cn/news/detail-460078.html
到了這里,關(guān)于Simple Factory Pattern 簡單工廠模式簡介與 C# 示例【創(chuàng)建型】【設(shè)計模式來了】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!