引言
工廠設計模式是一種常用于實例化對象模式,通過工廠的方法返回需要的對象實例。工廠設計模式被分為簡單工廠、工廠方法、抽象工廠三種設計模式。在前篇中介紹了簡單工廠設計模式,其中當需要增加一種新類型對象時,我們除了需增加一個新的對象類,還需要修改工廠類的代碼,這就使整個設計在一定程度上違反了開閉原則。本文介紹工廠方法設計模式。
工廠方法設計模式
工廠方法設計模式(Factory Method Pattern)它屬于創(chuàng)建型模式,與簡單工廠設計模式非常相似,工廠方法設計模式,對工廠類進一步抽象,將工廠提取成一個接口或抽象類。根據(jù)不同的需求返回相應的對象實例。
1、使用好處
封裝對象邏輯,符合開閉原則;
運行時動態(tài)創(chuàng)建對象;
降耦合度,提高可維護性;
2、構(gòu)成
工廠方法設計模式主要包含以下幾個角色組成:
抽象產(chǎn)品類:創(chuàng)建具體對象的父類,是對象所具有的公共接口。
具體產(chǎn)品類:是具體對象實現(xiàn)的邏輯,繼承于抽象產(chǎn)品類。
抽象工廠類:實現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。
具體工廠類:實現(xiàn)了抽象產(chǎn)品所定義的接口。
調(diào)用端: 實現(xiàn)調(diào)用工廠類,實現(xiàn)業(yè)務功能。
結(jié)構(gòu)圖示
實現(xiàn)
在C#中,工廠方法設計模式(Factory Method)的實現(xiàn)涉及幾個關(guān)鍵步驟,以下是實現(xiàn)示例描述。(示例模擬調(diào)用平臺快遞面單打印)
1、定義快遞面單抽象基類:分析對象,抽取共性的方法、屬性等。
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
/// <summary>
/// 快遞面單
/// </summary>
public abstract class ExpressWaybill
{
/// <summary>
/// 打印
/// </summary>
/// <param name="jsonContent">打印數(shù)據(jù)</param>
public abstract void Print(string jsonContent);
}
}
2、定義快遞面單具體子類:實現(xiàn)自己的方法。
using System;
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
/// <summary>
/// 菜鳥快遞面單
/// </summary>
public class CaiNiao: ExpressWaybill
{
/// <summary>
/// 打印
/// </summary>
/// <param name="jsonContent">打印數(shù)據(jù)</param>
public override void Print(string jsonContent)
{
Console.WriteLine("往菜鳥打印組件發(fā)送請求:" + jsonContent);
}
}
}
using System;
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
/// <summary>
/// 抖音快遞面單
/// </summary>
public class Douyin: ExpressWaybill
{
/// <summary>
/// 打印
/// </summary>
/// <param name="jsonContent">打印數(shù)據(jù)</param>
public override void Print(string jsonContent)
{
Console.WriteLine("往抖音打印組件發(fā)送請求:" + jsonContent);
}
}
}
using System;
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
/// <summary>
/// 視頻號快遞面單
/// </summary>
public class ShiPinHao: ExpressWaybill
{
/// <summary>
/// 打印
/// </summary>
/// <param name="jsonContent">打印數(shù)據(jù)</param>
public override void Print(string jsonContent)
{
Console.WriteLine("往視頻號打印組件發(fā)送請求:" + jsonContent);
}
}
}
3、定義創(chuàng)建快遞面單的抽象工廠:分析對象,抽取共性的方法、屬性等。
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
public abstract class ExpressWaybillCreator
{
protected abstract ExpressWaybill MakeExpressWaybill();
/// <summary>
///
/// </summary>
/// <returns></returns>
public ExpressWaybill CreateExpressWaybill()
{
return this.MakeExpressWaybill();
}
}
}
4、定義創(chuàng)建快遞面單具體工廠:分析對象,抽取共性的方法、屬性等。
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
public class CaiNiaoCreator:ExpressWaybillCreator
{
protected override ExpressWaybill MakeExpressWaybill()
{
ExpressWaybill expressWaybill = new CaiNiao();
return expressWaybill;
}
}
}
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
public class DouyinCreator:ExpressWaybillCreator
{
protected override ExpressWaybill MakeExpressWaybill()
{
ExpressWaybill expressWaybill = new Douyin();
return expressWaybill;
}
}
}
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
public class ShiPinHaoCreator:ExpressWaybillCreator
{
protected override ExpressWaybill MakeExpressWaybill()
{
ExpressWaybill expressWaybill = new ShiPinHao();
return expressWaybill;
}
}
}
5、實現(xiàn)模式調(diào)用:
using System;
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
internal class Program
{
static void Main(string[] args)
{
ExpressWaybill expressWaybill;
Console.WriteLine("輸入快遞面單類型!CaiNaio、ShiPinHao 或 Douyin.");
string userInput = Console.ReadLine();
switch (userInput)
{
case "CaiNaio":
expressWaybill = new CaiNiaoCreator().CreateExpressWaybill();
break;
case "ShiPinHao":
expressWaybill = new ShiPinHaoCreator().CreateExpressWaybill();
break;
case "Douyin":
expressWaybill = new DouyinCreator().CreateExpressWaybill();
break;
default:
expressWaybill = null;
break;
}
if (expressWaybill != null)
{
expressWaybill.Print(userInput);
}
Console.Read();
}
}
}
小結(jié)
以上是工廠方法設計模式的相關(guān)內(nèi)容及在C#中模擬實現(xiàn)的示例。
該文章在 2024/7/18 11:59:45 編輯過