了解C#中的工厂方法设计模式实现与示例
				
									
					
					
						|  | 
							admin 2024年7月18日 11:57
								本文热度 2822 | 
					
				 
				引言
工厂设计模式是一种常用于实例化对象模式,通过工厂的方法返回需要的对象实例。工厂设计模式被分为简单工厂、工厂方法、抽象工厂三种设计模式。在前篇中介绍了简单工厂设计模式,其中当需要增加一种新类型对象时,我们除了需增加一个新的对象类,还需要修改工厂类的代码,这就使整个设计在一定程度上违反了开闭原则。本文介绍工厂方法设计模式。
工厂方法设计模式
工厂方法设计模式(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 编辑过