工厂模式与委托在C#中的应用
阅读:100
点赞:0
工厂模式是一种创建型设计模式,它提供了一种封装对象创建的方法。通过将对象的创建过程委托给工厂类,而不是直接实例化对象,工厂模式促进了松耦合,并使代码更加灵活和可维护。
委托简介
委托是C#中的一种类型安全函数指针,可用于引用方法。通过在工厂模式中使用委托,我们可以在对象创建过程中实现高度灵活性,根据特定条件或运行时环境动态选择要创建的对象。
工厂设计模式的好处
-
封装对象创建:工厂类屏蔽了客户端代码与对象实例化细节之间的复杂关系,使代码更清晰易懂。 -
松耦合:通过解耦客户端与具体类,工厂模式增强了系统的灵活性和可维护性。 -
提升复用性:工厂模式可在应用程序的不同部分有效生成多种类型的对象,简化开发过程。
示例说明
步骤 1. 创建ASP.NET Core Web API项目
步骤 2. 创建Models文件夹并添加Mobile类
public class Mobile
{
public required Guid Id { get; set; }
public required string Name { get; set; }
}
步骤 3. 创建Contracts文件夹并添加IMobileProvider接口
public interface IMobileProvider
{
IReadOnlyCollection<Mobile> GetMobiles();
}
步骤 4. 创建Providers文件夹,并在其中创建Apple和Samsung类,实现IMobileProvider接口
public class Apple : IMobileProvider
{
public IReadOnlyCollection<Mobile> GetMobiles()
{
return new List<Mobile>
{
new Mobile { Id = Guid.NewGuid(), Name = "iPhone 16 Pro Max" },
new Mobile { Id = Guid.NewGuid(), Name = "iPhone 16 Pro" },
new Mobile { Id = Guid.NewGuid(), Name = "iPhone 15 Pro Max" },
new Mobile { Id = Guid.NewGuid(), Name = "iPhone 15 Pro" }
};
}
}
public class Samsung : IMobileProvider
{
public IReadOnlyCollection<Mobile> GetMobiles()
{
return new List<Mobile>
{
new Mobile { Id = Guid.NewGuid(), Name = "S24 Ultra" },
new Mobile { Id = Guid.NewGuid(), Name = "S23 Ultra" },
new Mobile { Id = Guid.NewGuid(), Name = "S22 Ultra" },
new Mobile { Id = Guid.NewGuid(), Name = "S20 Ultra" }
};
}
}
步骤 5. 在Program.cs文件中注册服务到容器
using FactoryDesignPatternUsingDelegates.Contracts;
using FactoryDesignPatternUsingDelegates.Providers;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<Func<string, IMobileProvider>>(provider =>
{
return provider?.ToUpper() switch
{
"APPLE" => new Apple(),
"SAMSUNG" => new Samsung(),
_ => throw new ArgumentException("Invalid Provider")
};
});
builder.Services.AddControllers();
var app = builder.Build();
app.UseAuthorization();
app.MapControllers();
app.Run();
这段代码利用依赖注入(DI)注册了一个服务,该服务根据提供的字符串创建不同的移动提供商对象。
步骤 6. 创建Controllers文件夹并添加MobilesController API控制器
[Route("api/[controller]")]
[ApiController]
public class MobilesController : ControllerBase
{
private readonly Func<string, IMobileProvider> _provider;
public MobilesController(Func<string, IMobileProvider> provider)
{
_provider = provider;
}
[HttpGet("{provider}")]
public IActionResult GetMobiles(string provider)
{
return Ok(_provider?.Invoke(provider).GetMobiles());
}
}
步骤 7. 测试端点
应用程序监听5000端口。在浏览器中访问http://localhost:5000/api/mobiles/apple
,将显示所有苹果产品。同样,访问http://localhost:5000/api/mobiles/samsung
,将显示所有三星产品。
结论
通过在工厂模式中使用委托,我们可以创建更灵活、可维护和可测试的C#应用程序。这种方法提高了代码的模块化和可重用性,同时保持了系统的松耦合性。