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