1

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

工厂代码:

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();
        }
    }

我的意思是按预期工作...但是您在这里看到任何问题吗?因为我不...

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

提前致谢

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

4

2 回答 2

2

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

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

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

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

于 2013-04-17T07:13:08.290 回答
0

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

于 2013-04-17T07:16:19.430 回答