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

C# 我应该使用工厂模式吗?

C# 我应该使用工厂模式吗?,c#,design-patterns,C#,Design Patterns,我目前有一个名为ConfigProfile factory的类,它包含默认配置文件、当前设置等的方法。该类由我的配置文件服务在内部使用。我在想,最好是让它成为一个真正的工厂,为我们正在配置的每个产品创建适当的配置文件服务 public string GetDefaultProfile(string product) { if (string.IsNullOrEmpty(product)) { throw new Argume

我目前有一个名为ConfigProfile factory的类,它包含默认配置文件、当前设置等的方法。该类由我的配置文件服务在内部使用。我在想,最好是让它成为一个真正的工厂,为我们正在配置的每个产品创建适当的配置文件服务

    public string GetDefaultProfile(string product)
    {
        if (string.IsNullOrEmpty(product))
        {
            throw new ArgumentNullException("product");
        }

        string profile = null;

        if (product.Contains("Product 1", StringComparison.CurrentCultureIgnoreCase) ||
            product.Contains("product1", StringComparison.CurrentCultureIgnoreCase))
        {
            profile = Resources.product1DefaultProfile;
        }

        return profile;
    }
这只是一个产品,但我们还有几个产品,这意味着我必须为每个产品添加更多的if语句。配置文件服务已经有了一个接口,我的大部分程序都使用它。还有几种方法也使用同样的方法。那么,基于产品名称返回相应配置文件服务的工厂是更好的解决方案还是我可以做些其他事情


编辑:这是这个类中比较简单的方法之一。更复杂的是从所需位置检索当前系统设置。像所有产品一样,都有IIS设置,但有些产品有主题支持,而有些产品有数据库配置。Factory是一个非常好的解决方案。它允许您将配置的复杂性隐藏在一个简单的界面后面

如果您需要能够在运行时/启动时对其进行配置,请结合策略

这两种解决方案——静态工厂或策略——都可以与原型相结合。如果您经常使用相同的概要文件,并且它是只读的,那么Prototype将作为一种优化非常有用


编辑:您可能已经在使用Prototype了。您的示例代码看起来像是在复制/引用配置文件,而不是将其构建为一个复杂的产品。

Factory是一个非常好的解决方案。它允许您将配置的复杂性隐藏在一个简单的界面后面

如果您需要能够在运行时/启动时对其进行配置,请结合策略

这两种解决方案——静态工厂或策略——都可以与原型相结合。如果您经常使用相同的概要文件,并且它是只读的,那么Prototype将作为一种优化非常有用


编辑:您可能已经在使用Prototype了。您的示例代码看起来像是在复制/引用配置文件,而不是将其作为一个复杂的产品进行构建。

我需要一个映射,其中名称是键,值是配置文件。不同的产品有什么不同?听起来它对所有产品的作用都是一样的。我不认为有必要建工厂。它可能是一样的,只是有不同的部分。就像我们做的第一个产品一样,我们只处理IIS和web.config,但对于另一个产品,除了附加主题和数据库内容之外,它将是相同的。这些部分中的每一部分都有自己的服务来设置它们,例如IIS有自己的服务类来应用设置并读取当前设置。请注意:当参数不为null,仅为空时,您的方法可以抛出
ArgumentNullException
。如果不应传入空的非空参数,则应抛出
ArgumentException
@ThomSmith好的,我将更改它。我打算在null和empty上抛出异常,因为它不应该是null和empty。如果我有一个像UnityContainer这样的IOC容器,我会用产品名注册这个类,这样我就可以用这个产品名解析它。我会有一个映射,其中名称是键,值是配置文件。不同的产品有什么不同?听起来它对所有产品的作用都是一样的。我不认为有必要建工厂。它可能是一样的,只是有不同的部分。就像我们做的第一个产品一样,我们只处理IIS和web.config,但对于另一个产品,除了附加主题和数据库内容之外,它将是相同的。这些部分中的每一部分都有自己的服务来设置它们,例如IIS有自己的服务类来应用设置并读取当前设置。请注意:当参数不为null,仅为空时,您的方法可以抛出
ArgumentNullException
。如果不应传入空的非空参数,则应抛出
ArgumentException
@ThomSmith好的,我将更改它。我打算在null和empty上抛出异常,因为它不应该是null和empty。如果我有一个像UnityContainer这样的IOC容器,我会用产品名注册该类,以便使用该产品名解析它。对于默认配置文件,我只是引用参考资料中的静态xml文档,但对于当前设置,我构建了一个复杂的对象。谢谢你的回答。为什么要感谢你的跟进呢。总是很高兴了解更多关于这个问题的信息:)对于这个默认配置文件,我只是引用了参考资料中的一个静态xml文档,但是对于当前的设置,我构建了一个复杂的对象。谢谢你的回答。为什么要感谢你的跟进呢。了解更多有关此问题的信息总是很好:)