##一、前言 **工廠模式常見的詞:簡單工廠、工廠方法、抽象工廠。簡單工廠不屬於23種經典設計模式,但通常將它作為學習其他工廠模式的基礎。** ##二、簡單工廠 ###1、定義 **定義一個工廠類,它可以根據參數的不同返回不同類型的實例,被創建的實例通常都具有共同的父類。由於簡單的工廠模式中用於創建 ...
一、前言
工廠模式常見的詞:簡單工廠、工廠方法、抽象工廠。簡單工廠不屬於23種經典設計模式,但通常將它作為學習其他工廠模式的基礎。
二、簡單工廠
1、定義
定義一個工廠類,它可以根據參數的不同返回不同類型的實例,被創建的實例通常都具有共同的父類。由於簡單的工廠模式中用於創建實例的方法通常是靜態方法,所以簡單工廠又被稱作為靜態工廠。
2、例子
例:開發一套圖表庫,根據不同的參數可以創建柱狀圖BarChart,直線圖LineChart,餅狀圖PieChart,下麵使用簡單工廠來實現。
Chart:抽象圖表介面,充當抽象產品類
namespace _02_FactoryMethod
{
internal interface Chart
{
void Display();
}
}
BarChart:柱狀圖類,充當具體產品類
namespace _02_FactoryMethod
{
class BarChart : Chart
{
public BarChart()
{
Console.WriteLine("創建柱狀圖");
}
public void Display()
{
Console.WriteLine("顯示柱狀圖");
}
}
}
LineChart:折線圖類,充當具體產品類
namespace _02_FactoryMethod
{
internal class LineChart : Chart
{
public LineChart()
{
Console.WriteLine("創建折線圖");
}
public void Display()
{
Console.WriteLine("顯示折線圖");
}
}
}
PieChart:餅圖類,充當具體產品類
namespace _02_FactoryMethod
{
internal class PieChart : Chart
{
public PieChart()
{
Console.WriteLine("創建餅圖");
}
public void Display()
{
Console.WriteLine("顯示餅圖");
}
}
}
ChartFactory:圖表工廠類,充當工廠類
namespace _02_FactoryMethod
{
internal class ChartFactory
{
public static Chart GetChart(string type)
{
Chart chart = null;
if (type.Equals("bar"))
{
chart = new BarChart();
}
else if (type.Equals("line"))
{
chart = new LineChart();
}
else if (type.Equals("pie"))
{
chart = new PieChart();
}
return chart;
}
}
}
Program:測試代碼
Chart chart = ChartFactory.GetChart("bar");
chart.Display();
簡單工廠也可以再簡化,直接將抽象類和工廠類合併,因為並不是所有類型的產品都那麼複雜。
3、總結
實際應用中,簡單工廠肯定是難當大任的,工廠類職責過重,一旦出現問題,整個程式直接崩潰,而且產品類不易拓展,新增就意味著改代碼。當然,如果只是一個簡單程式,配合使用反射、配置文件等手段可以快速完成開發,相信大家都“吃過豬肉也見過豬跑”。
三、工廠方法
1、定義
定義一個用於創建對象的介面,但是讓子類決定將哪一個實例化。工廠方法模式讓一個類的實例化延遲到其子類,是一種創建型模式。與簡單工廠相比,引入了抽象工廠角色。工廠方法模式包含以下四個角色:
1、Product(抽象產品):它是定義產品的介面,是工廠方法模式所創建對象的超類型,也就是產品對象的公共父類。
2、ConcreteProduct(具體產品):它實現了抽象產品介面,某種類型的具體產品由專門的具體工廠創建,具體工廠和具體產品之間一一對應。
3、Factory(抽象工廠):在抽象工廠類中,聲明瞭工廠方法(Factory Method),用於返回一個產品。抽象工廠是工廠方法模式的核心,所有創建對象的工廠類都必須實現該介面。
4、ConcreteFactory(具體工廠):它是抽象工廠類的子類,實現了在抽象工廠中聲明的工廠方法,由客戶端調用,返回一個具體產品類的實例。
2、例子
例:系統封裝多種記錄日誌方式,包括文件記錄日誌、資料庫記錄日誌等,可以根據需求切換。
LoggerFactory:抽象產品工廠介面,供具體產品(資料庫記錄日誌、文件記錄日誌)工廠繼承,實現創建具體產品類的方法
public interface LoggerFactory
{
public Logger CreateLogger();
}
DataBaseLoggerFactory:資料庫記錄日誌工廠類,繼承抽象產品工廠介面
public class DataBaseLoggerFactory : LoggerFactory
{
public Logger CreateLogger()
{
//創建資料庫業務代碼略
Logger logger = new DataBaseLogger();
return logger;
}
}
FileLoggerFactory:文件記錄日誌工廠類,繼承抽象產品工廠介面
public class FileLoggerFactory : LoggerFactory
{
public Logger CreateLogger()
{
//創建文件業務代碼略
Logger logger = new FileLogger();
return logger;
}
}
Logger:抽象產品介面,供具體產品類繼承,實現記錄日誌的具體方法
public interface Logger
{
void WriteLog();
}
DataBaseLogger:資料庫記錄日誌類,繼承抽象產品
public class DataBaseLogger : Logger
{
public void WriteLog()
{
Console.WriteLine("資料庫記錄日誌");
}
}
FileLogger:文件記錄日誌類,繼承抽象產品
public class FileLogger : Logger
{
public void WriteLog()
{
Console.WriteLine("文件記錄日誌");
}
}
Program:客戶端測試類
LoggerFactory loggerFactory = new DataBaseLoggerFactory();
Logger logger = loggerFactory.CreateLogger();
logger.WriteLog();
3、總結
工廠方法模式除了包含簡單工廠的優點,還彌補了不足,當需要添加新產品時,只需要添加一個具體工廠和具體產品即可,無需改動已有代碼,增強系統可擴展性,符合開閉原則。當然這同時也增加了系統的理解難度,具體產品類過多的話,系統將變得無比龐大。
測試簽名