Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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

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_Factory - Fatal编程技术网

C# 工厂模式:确定具体的工厂类实例化?

C# 工厂模式:确定具体的工厂类实例化?,c#,design-patterns,factory,C#,Design Patterns,Factory,我试图学习模式,但我一直在确定工厂模式如何或在何处决定实例化哪个类。如果我有一个调用工厂并发送它的应用程序,比如一个xml配置文件,以确定要采取的操作类型,那么解释配置文件的逻辑会发生在哪里 工厂 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace myNamespace { public abstract class SourceFactory

我试图学习模式,但我一直在确定工厂模式如何或在何处决定实例化哪个类。如果我有一个调用工厂并发送它的应用程序,比如一个xml配置文件,以确定要采取的操作类型,那么解释配置文件的逻辑会发生在哪里

工厂

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace myNamespace
{
    public abstract class SourceFactory
    {
        abstract public UploadSource getUploadSource();
    }
    public class TextSourceFactory : SourceFactory
    {
        public override UploadSource getUploadSource()
        {
            return new TextUploadSource();
        }
    }
    public class XmlSourceFacotry : SourceFactory
    {
        public override UploadSource getUploadSource()
        {
            return new XmlUploadSource();
        }
    }
    public class SqlSourceFactory : SourceFactory
    {
        public override UploadSource getUploadSource()
        {
            return new SqlUploadSource();
        }
    }
}
班级

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace myNamespace
{
    public abstract class UploadSource
    {
        abstract public void Execute();
    }
    public class TextUploadSource : UploadSource
    {
        public override void Execute()
        {
            Console.WriteLine("You executed a text upload source");
        }
    }
    public class XmlUploadSource : UploadSource
    {
        public override void Execute()
        {
            Console.WriteLine("You executed an XML upload source");
        }
    }
    public class SqlUploadSource : UploadSource
    {
        public override void Execute()
        {
            Console.WriteLine("You executed a SQL upload source");
        }
    }
}

要实例化的实际工厂是在运行时选择的,通常由一个单独的工厂加载程序类来选择。加载程序可以获得必要的配置,例如在xml配置文件中,并从中读取要加载的具体工厂的类名

这本身并不是一个非常复杂的逻辑;将其放入factory loader类的原因是可重用性。你可以在你的应用程序中有很多工厂,而且大多数工厂加载的代码都非常相似,所以将其放入一个单独的类(层次结构)中可以消除代码重复。当然,逻辑可能与这个例子不同,也可能更复杂


例如,一个更动态的场景是在xml文件中指定按钮/菜单项和类名之间的映射,然后在GUI上,用户可以通过按下按钮/选择菜单项来更改要使用的工厂。

了解您只是在学习模式。在生产环境中,通常最好使用控制反转容器,该容器实现工厂和其他创建模式。在C#world,温莎城堡是一个常见的国际奥委会容器。正如@peter在下面指出的,工厂加载器负责解释配置。这通常采取“为了这个接口,加载这个具体的类”的形式。@Rob:程序员(或想成为程序员的人)什么时候开始设计可重用、可伸缩、松散耦合、强内聚的软件?这不是oop,也不是模式,因为现在是IOC。责任何在?IOC只是一个使创建模式更容易实现的工具。就我个人而言,我喜欢有人编写一堆软件,让我的工作更轻松。因此,你会有一个基于工厂加载程序接口的独立继承树,其中每个不同的具体实例化都包含需要创建的任何对象的特定逻辑?@Theringostars,逻辑实际上是相同的,一个,只有混凝土工厂类别不同。所以人们也可以使用构图——事实上,如果可能的话,我可能更喜欢这样。