【发布时间】:2023-04-06 22:00:01
【问题描述】:
我正在寻找example 以了解工厂模式的使用。
我真的是这个领域的爱好者,所以请原谅我的愚蠢问题。
我的问题是我没有看到工厂模式的使用,它返回了我们可以在需要时直接注入它的接口。
在上面的例子中,我会做这样的事情:
public class Program
{
// register the interfaces with DI container in a separate config class (Unity in this case)
private readonly IShippingStrategy _shippingStrategy;
public Program(IShippingStrategy shippingStrategy)
{
_shippingStrategy= shippingStrategy;
}
public int DoTheWork(Order order)
{
// assign properties just as an example
order.ShippingMethod = "Fedex";
order.OrderTotal = 90;
order.OrderWeight = 12;
order.OrderZipCode = 98109;
int shippingCost = _shippingStrategy.CalculateShippingCost(order);
return shippingCost;
}
}
而不是注入工厂:
public class Program
{
// register the interfaces with DI container in a separate config class (Unity in this case)
private readonly IShippingStrategyFactory _shippingStrategyFactory;
public Program(IShippingStrategyFactory shippingStrategyFactory)
{
_shippingStrategyFactory = shippingStrategyFactory;
}
public int DoTheWork(Order order)
{
// assign properties just as an example
order.ShippingMethod = "Fedex";
order.OrderTotal = 90;
order.OrderWeight = 12;
order.OrderZipCode = 98109;
IShippingStrategy shippingStrategy = _shippingStrategyFactory.GetShippingStrategy(order);
int shippingCost = shippingStrategy.CalculateShippingCost(order);
return shippingCost;
}
}
既然我们可以将接口直接注入到我们需要使用它的任何地方,为什么还要冒昧地创建一个工厂(从而添加一个额外的层)?
【问题讨论】:
-
请解释如何让注入的运输策略依赖于订单,这从工厂方法的参数可以看出。
-
依赖注入是一个通用概念,通常 DI 是通过使用 DI 框架来完成的,它本质上只是一种通用工厂模式,它允许非常灵活的配置工具。因此,本质上,DI 框架IS 是一个工厂。但并非所有工厂都是 DI 框架。通常,一个工厂指的是定制工厂,针对特定情况进行定制。一些 DI 框架甚至允许您指定自定义工厂以更精细地控制逻辑。
标签: c# design-patterns dependency-injection factory-pattern