Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这能作为一种通用的工厂方法工作吗?_C#_Design Patterns_Generics_Factory Pattern - Fatal编程技术网

C# 这能作为一种通用的工厂方法工作吗?

C# 这能作为一种通用的工厂方法工作吗?,c#,design-patterns,generics,factory-pattern,C#,Design Patterns,Generics,Factory Pattern,我只是胡闹了一下,我有了这个想法,这是一个通用工厂方法模式的好实现吗 工厂代码: public static class Factory { public static T Create<T>() where T : new() { return new T(); } } 公共静态类工厂 { 公共静态T Create(),其中T:new() { 返回新的T(); } } 给其他地方的工厂打电话: class Program {

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

工厂代码:

public static class Factory
{
    public static T Create<T>() where T : new()
    {
        return new T();
    }
}
公共静态类工厂
{
公共静态T Create(),其中T: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();
        }
    }
类程序
{
静态void Main(字符串[]参数)
{
var obj=Factory.Create();
obj.Name=“标记”;
Console.WriteLine(对象名称);
var obj2=Factory.Create();
obj2.AnimalType=“狗”;
Console.WriteLine(obj2.AnimalType);
dynamic obj3=Factory.Create();
obj3.年龄=20岁;
控制台写入线(obj3.Age);
Console.ReadKey();
}
}
我的意思是,你的工作和预期的一样。。。但是你觉得这里有什么问题吗?因为我不

任何建议都将不胜感激,因为我正计划使用工厂来实例化对象,而且这些似乎很好

提前感谢:D


编辑:为了澄清问题,我修改了工厂方法的名称,因为前面的名称是GetInstance,它很混乱。

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

事实上,这在很大程度上挫败了建立工厂的理由。它不返回抽象,也不适合构建昂贵的对象。此外,您的代码将耦合到工厂

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


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

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

我不确定我是否真正理解工厂,因为我只阅读了“头部优先:设计模式”。然而,根据我的经验,工厂应该生产一些具有相同祖先(或实现相同接口)的产品。并且您的工厂仅受“new()”条件的限制。我认为这意味着每个T都是
对象
的继承者,但是
对象
没有提供
年龄
动物类型
名称
。在我看来,工厂应该更适合T.的使用条件。当您为同一类型调用GetInstance时,您的工厂将返回一个新实例twice@COLDTOLD只要做一些随机的事情,var也会工作得很好。@WouterHuysentruit这不是工厂的想法吗?我没有为工厂的产品尝试任何单例。我认为应该可以为注册为单例的类型返回单例,但我不是工厂专家。通过autofac实现日志记录:builder.RegisterType().OnActivated(e=>e.Context.Resolve().Log(“Object created”)@迈克,我同意。一般来说,几乎所有IoC容器都具有此功能,在大多数情况下,应该使用IoC容器而不是创建自定义工厂方法。