【问题标题】:Could this work as a Generic Factory method?这可以作为通用工厂方法工作吗?
【发布时间】:2013-04-17 01:39:05
【问题描述】:

只是胡闹,我想到了这个想法,这是通用工厂方法模式的一个很好的实现吗?

工厂代码:

public static class Factory
{
    public static T Create<T>() where T : new()
    {
        return new T();
    }
}

在其他地方调用工厂:

 class Program
    {
        static void Main(string[] args)
        {
            var obj = Factory.Create<Person>();
            obj.Name = "Mark";
            Console.WriteLine(obj.Name);

            var obj2 = Factory.Create<Animal>();
            obj2.AnimalType= "Dog";
            Console.WriteLine(obj2.AnimalType);

            dynamic obj3 = Factory.Create<ExpandoObject>();
            obj3.Age= 20;

            Console.WriteLine(obj3.Age);

            Console.ReadKey();
        }
    }

我的意思是按预期工作...但是您发现这里有什么问题吗?因为我不...

任何建议都将不胜感激,因为我计划使用工厂来实例化对象,这些看起来不错..

提前致谢:D

编辑:我修改了工厂方法的名称以澄清问题,因为以前的名称是 GetInstance 并且令人困惑。

【问题讨论】:

  • 我不确定我是否真的了解 Factory,因为我只阅读了“Head-first : design pattern”。但是,根据我的经验,工厂应该生产一些具有相同祖先(或实现相同接口)的产品。而且您的工厂仅受“new()”条件的限制。我认为这意味着每个 T 都是 Object 的继任者,但 Object 没有提供 AgeAnimalTypeName。在我看来,工厂应该是T的更多条件。
  • 使用autofac。当您为同一类型调用 GetInstance 两次时,您的工厂将返回一个新实例
  • @COLDTOLD 只是做一些随机的事情, var 也可以正常工作。
  • @WouterHuysentruit 这不是工厂的想法吗?我不会为工厂的产品尝试任何单例。
  • 我认为应该可以为您注册为单例的类型返回单例,但我不是工厂专家。

标签: c# design-patterns generics factory-pattern


【解决方案1】:

您的代码在技术上是正确的,但 IMO 没用。使用这个工厂没有任何好处。对于您需要的每个新实例,使用 new 会更加容易。所以,这是个问题。

事实上,这几乎与拥有工厂的理由相悖。它不返回抽象,也不适合构建昂贵的对象。此外,您的代码将与工厂耦合。

一个 DI 容器,autofac 非常好,几乎是一个工厂,并且知道如何处理注册到它的任何类型的实例化。此外,它还可用于注入您需要的任何实例作为依赖项。

总之,我想说对简单的情况使用 new 关键字,对具有依赖关系的对象使用 DI 容器。您编写的 Factory 类及其用法实际上更像是糟糕的代码,因此请不要在实际应用中使用它。

【讨论】:

    【解决方案2】:

    该示例运行良好,但我很难想象您真正需要它的情况。我想到的唯一用法是当您需要在每个对象创建操作时进行一些日志记录或类似的事情时。否则,您可以只调用目标类型构造函数。 通常你使用工厂来创建实现通用接口的不同对象。因此,工厂的客户不知道所使用接口的确切实现,从而导致解决方案耦合度降低。基本上工厂知道一些接口的具体实现,而工厂的消费者不知道,这是主要思想。

    【讨论】:

    • 通过 autofac 实现日志记录:builder.RegisterType() .OnActivated(e => e.Context.Resolve().Log("Object created"));
    • @MikeSW,我同意。一般来说,几乎所有 IoC 容器都具有此功能,并且在大多数情况下,应该使用 IoC 容器而不是创建自定义工厂方法。
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2023-03-23
    • 2020-12-27
    • 2016-11-02
    • 1970-01-01
    相关资源
    最近更新 更多