了解C#中的工厂方法设计模式实现与示例
|
admin
2024年7月18日 11:57
本文热度 806
|
引言
工厂设计模式是一种常用于实例化对象模式,通过工厂的方法返回需要的对象实例。工厂设计模式被分为简单工厂、工厂方法、抽象工厂三种设计模式。在前篇中介绍了简单工厂设计模式,其中当需要增加一种新类型对象时,我们除了需增加一个新的对象类,还需要修改工厂类的代码,这就使整个设计在一定程度上违反了开闭原则。本文介绍工厂方法设计模式。
工厂方法设计模式
工厂方法设计模式(Factory Method Pattern)它属于创建型模式,与简单工厂设计模式非常相似,工厂方法设计模式,对工厂类进一步抽象,将工厂提取成一个接口或抽象类。根据不同的需求返回相应的对象实例。
1、使用好处
封装对象逻辑,符合开闭原则;
运行时动态创建对象;
降耦合度,提高可维护性;
2、构成
工厂方法设计模式主要包含以下几个角色组成:
抽象产品类:创建具体对象的父类,是对象所具有的公共接口。
具体产品类:是具体对象实现的逻辑,继承于抽象产品类。
抽象工厂类:实现抽象工厂中的抽象方法,完成具体产品的创建。
具体工厂类:实现了抽象产品所定义的接口。
调用端: 实现调用工厂类,实现业务功能。
结构图示
实现
在C#中,工厂方法设计模式(Factory Method)的实现涉及几个关键步骤,以下是实现示例描述。(示例模拟调用平台快递面单打印)
1、定义快递面单抽象基类:分析对象,抽取共性的方法、属性等。
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
/// <summary>
/// 快递面单
/// </summary>
public abstract class ExpressWaybill
{
/// <summary>
/// 打印
/// </summary>
/// <param name="jsonContent">打印数据</param>
public abstract void Print(string jsonContent);
}
}
2、定义快递面单具体子类:实现自己的方法。
using System;
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
/// <summary>
/// 菜鸟快递面单
/// </summary>
public class CaiNiao: ExpressWaybill
{
/// <summary>
/// 打印
/// </summary>
/// <param name="jsonContent">打印数据</param>
public override void Print(string jsonContent)
{
Console.WriteLine("往菜鸟打印组件发送请求:" + jsonContent);
}
}
}
using System;
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
/// <summary>
/// 抖音快递面单
/// </summary>
public class Douyin: ExpressWaybill
{
/// <summary>
/// 打印
/// </summary>
/// <param name="jsonContent">打印数据</param>
public override void Print(string jsonContent)
{
Console.WriteLine("往抖音打印组件发送请求:" + jsonContent);
}
}
}
using System;
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
/// <summary>
/// 视频号快递面单
/// </summary>
public class ShiPinHao: ExpressWaybill
{
/// <summary>
/// 打印
/// </summary>
/// <param name="jsonContent">打印数据</param>
public override void Print(string jsonContent)
{
Console.WriteLine("往视频号打印组件发送请求:" + jsonContent);
}
}
}
3、定义创建快递面单的抽象工厂:分析对象,抽取共性的方法、属性等。
namespace Fountain.WinConsole.DesignPatternFactoryMethod
{
public abstract class ExpressWaybillCreator
{
protected abstract ExpressWaybill MakeExpressWaybill();
/// <summary>
///
/// </summary>
/// <returns></returns>
public ExpressWaybill CreateExpressWaybill()
{
return this.MakeExpressWaybill();
}
}
}
4、定义创建快递面单具体工厂:分析对象,抽取共性的方法、属性等。
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、实现模式调用:
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();
}
}
}
小结
以上是工厂方法设计模式的相关内容及在C#中模拟实现的示例。
该文章在 2024/7/18 11:59:45 编辑过