【问题标题】:Factory or DI suitable for inheritance适合继承的工厂或DI
【发布时间】:2013-08-13 15:55:51
【问题描述】:

我有不同种类的报价单,例如船报价单、摩托车报价单、汽车报价单,它们都派生自 Quote 类。当客户想要获得报价时,我只需要返回报价。 我可以通过两种方式实现:

工厂:

public class QuoteFactory{
     public Quote GetQuote(string QuoteType )
     {
      if(quoteType = "car")
         {
           return new CarQuote()
        }
     }

使用 Spring.Core 进行 DI

将所有引用类型添加到上下文中,然后让客户决定需要哪种类型。 提前致谢。

【问题讨论】:

  • 您应该使用满足您需求的一种,并且您只概述了一种您认为可以同时满足两种方法的方法。您还没有为 DI 案例提供任何代码,我不确定您将如何使用 DI 实现这一点。如果它们都满足您的需求,如果您发现您的设计妨碍可测试性或其他任何问题,请掷硬币并稍后重构。
  • 你是在吹嘘还是有问题?
  • @itsme86 我认为这是“我应该使用工厂还是 DI?”尽管如此,这不是一个很好的问题,因为两者都做同样的事情并且选择是任意的,缺乏其他要求,或者只有其中一个可以工作并且选择是显而易见的。 (或者 OP 希望我们给他一个关于非功能性设计约束的概要,在这种情况下,我的魔法八球说前景不是很好,因为这些天对于建筑宇航员的独白来说 SO 并不多。)
  • @itsme,把我当成一个学习设计模式的新人吧:)
  • 那么,我可以推荐一本书吗?此外,当涉及到它们解决的问题时,设计模式并不是零重叠的。当前的集体想法是 SO 不是教学网站,以及“做 X 的最佳方法是什么?”缺乏任何其他约束的问题表现不佳。特别是因为这意味着您的问题没有上下文,并且“现实世界”的解决方案实际上可能是几个工厂,每个工厂都在需要的地方注入。 (所以销售汽车的模块会得到CarQuoteFactory 等)或者它可能不会,没有上下文就不容易分辨。

标签: c# design-patterns ooad


【解决方案1】:

不确定您的问题,但这是使用 DI 重构的工厂:

public class QuoteFactory : IQuoteFactory{
    public QuoteFactory(Quote boatQ, Quote motorQ, Quote carQ){
        // parameter assignment
    }
    Quote boatQ;
    Quote motorQ;
    Quote carQ;

    public Quote Create(string quote){
        if(quote == "car") return carQ;
        //further condition
    }
}

使用这种设计,您可以依靠 DI Container 来处理构造函数注入。此外,您可以通过注入 IDictionary<string, Quote> 来替换此设计。

【讨论】:

    【解决方案2】:

    如果您只需要报价,那么该方法的意义何在。调用方法知道它想要什么类型的引用 - 它必须作为参数传入。如果您真的想将引号的创建抽象为可注入类(例如用于单元测试),为什么不创建一个泛型方法,例如:

    public class QuoteFactory : IQuoteFactory
    {
        public TQuote CreateQuote<TQuote>()
            where TQuote : new() // or Quote if specific attributes requied to be set by factory
        {
            return new TQuote();
        }
    }
    

    【讨论】:

    • 感谢 VegDork,我之前也在某处读到过 TQuote 风格,我想这可能是我会追求的。
    • 当然这与抽象报价创建完全相反(这是工厂应该做的),因为它所能做的就是以完全相同的方式创建报价的不同子类型.它作为引用工厂的基类会更有用,子类然后初始化特定于类型的属性。
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2014-05-03
    • 2022-01-19
    • 1970-01-01
    • 2020-08-06
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多