C# 工厂模式:确定具体的工厂类实例化?
我试图学习模式,但我一直在确定工厂模式如何或在何处决定实例化哪个类。如果我有一个调用工厂并发送它的应用程序,比如一个xml配置文件,以确定要采取的操作类型,那么解释配置文件的逻辑会发生在哪里 工厂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
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,逻辑实际上是相同的,一个,只有混凝土工厂类别不同。所以人们也可以使用构图——事实上,如果可能的话,我可能更喜欢这样。