引言
工廠設(shè)計(jì)模式是一種常用于實(shí)例化對(duì)象模式,通過工廠的方法返回需要的對(duì)象實(shí)例。工廠設(shè)計(jì)模式被分為簡(jiǎn)單工廠、工廠方法、抽象工廠三種設(shè)計(jì)模式。在前篇中介紹了簡(jiǎn)單工廠設(shè)計(jì)模式,其中當(dāng)需要增加一種新類型對(duì)象時(shí),我們除了需增加一個(gè)新的對(duì)象類,還需要修改工廠類的代碼,這就使整個(gè)設(shè)計(jì)在一定程度上違反了開閉原則。本文介紹工廠方法設(shè)計(jì)模式。
工廠方法設(shè)計(jì)模式
工廠方法設(shè)計(jì)模式(Factory Method Pattern)它屬于創(chuàng)建型模式,與簡(jiǎn)單工廠設(shè)計(jì)模式非常相似,工廠方法設(shè)計(jì)模式,對(duì)工廠類進(jìn)一步抽象,將工廠提取成一個(gè)接口或抽象類。根據(jù)不同的需求返回相應(yīng)的對(duì)象實(shí)例。
1、使用好處
2、構(gòu)成
工廠方法設(shè)計(jì)模式主要包含以下幾個(gè)角色組成:
抽象產(chǎn)品類:創(chuàng)建具體對(duì)象的父類,是對(duì)象所具有的公共接口。
具體產(chǎn)品類:是具體對(duì)象實(shí)現(xiàn)的邏輯,繼承于抽象產(chǎn)品類。
抽象工廠類:實(shí)現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。
具體工廠類:實(shí)現(xiàn)了抽象產(chǎn)品所定義的接口。
調(diào)用端: 實(shí)現(xiàn)調(diào)用工廠類,實(shí)現(xiàn)業(yè)務(wù)功能。
結(jié)構(gòu)圖示
實(shí)現(xiàn)
在C#中,工廠方法設(shè)計(jì)模式(Factory Method)的實(shí)現(xiàn)涉及幾個(gè)關(guān)鍵步驟,以下是實(shí)現(xiàn)示例描述。(示例模擬調(diào)用平臺(tái)快遞面單打印)
1、定義快遞面單抽象基類:分析對(duì)象,抽取共性的方法、屬性等。
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、定義快遞面單具體子類:實(shí)現(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ā)送請(qǐng)求:" + 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ā)送請(qǐng)求:" + jsonContent);
}
}
}
using System;
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
/// <summary>
/// 視頻號(hào)快遞面單
/// </summary>
public class ShiPinHao: ExpressWaybill
{
/// <summary>
/// 打印
/// </summary>
/// <param name="jsonContent">打印數(shù)據(jù)</param>
public override void Print(string jsonContent)
{
Console.WriteLine("往視頻號(hào)打印組件發(fā)送請(qǐng)求:" + jsonContent);
}
}
}
3、定義創(chuàng)建快遞面單的抽象工廠:分析對(duì)象,抽取共性的方法、屬性等。
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)建快遞面單具體工廠:分析對(duì)象,抽取共性的方法、屬性等。
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、實(shí)現(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é)
以上是工廠方法設(shè)計(jì)模式的相關(guān)內(nèi)容及在C#中模擬實(shí)現(xiàn)的示例。
該文章在 2024/7/18 11:59:45 編輯過