首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#架构-设计模式

C#架构-设计模式
EN

Stack Overflow用户
提问于 2012-03-07 17:39:20
回答 4查看 435关注 0票数 2

不确定如何实现此场景:

我有一个基类,比如说

代码语言:javascript
复制
   public abstract class ConfigurationBase
   {
     public int Id {get; set;}

     public string Name {get; set;}

   }

和几个派生类

代码语言:javascript
复制
   public class Config1 : ConfigurationBase
   {
     public string Url {get;set;}
     public string ReferrerUrl {get; set;}
   }


   public string Config2 : ConfigurationBase 
   {
     public string Domain {get; set;}
     public bool AllowCookie {get; set;}
   }

以及一个使用不同参数调用的ConfigurationService

其思想是根据参数范围构造一个Config1或Config2等实例。

所以问题是如何在代码中实现这一点?

根据相同的条件,实例化某个类型。

到目前为止,我们的一个想法是将要实例化的完全限定类型存储在数据库中,并通过反射构造它。

我有点不愿意使用这种方法,我在问是否有其他的答案。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-07 17:46:39

如果您了解ConfigurationBase的所有子类,并且实例化它们的规则是相同的,那么您应该看到的是Factory模式。

如果您不了解所有的子类,那么您需要从数据存储(不一定是数据库)中动态地提取类型,并在运行时实例化它。

如果您不知道实例化对象所依据的所有规则,则需要从数据存储中提取规则并执行它们。

显然,你让它变得越动态,你必须处理的复杂性就越大。

票数 1
EN

Stack Overflow用户

发布于 2012-03-07 17:46:09

我认为正确的方法是创建一个factory class来处理配置对象的创建:

代码语言:javascript
复制
public class ConfigurationFactory {
    public ConfigurationBase GetConfig(object[] parameters)
       // Build your objects here according to your params... do stuff...
       if (parameters[0] ...)
            return new Config2(...);
       elseif ...
            return new Config1(...);
    }
}

然后使用您的参数调用该方法

代码语言:javascript
复制
ConfigurationFactory factory = new ConfigurationFactory();
ConfigurationBase config = factory.GetConfig(parameters);

尽管这种方法需要了解如何创建不同的对象,但它只集中在一个地方,因此很容易更改。

此外,您可能希望定义一个更通用的接口来定义如何获取配置数据,这样您的对象将更容易处理,而无需知道它们的具体类型。

希望这能有所帮助

票数 4
EN

Stack Overflow用户

发布于 2012-03-07 17:45:24

工厂模式怎么样?

Edit:我意识到你不想保持单独的方法,在这种情况下,你将需要一个enum (至少)+一个(丑陋的)方法,接受所有可能的参数(即表中的列)

代码语言:javascript
复制
 public class ConfigurationService {

         private ConfigurationBase  CreateConfig1(string id, string name, string url, string referenceUrl){...}

         private ConfigurationBase  CreateConfig2(string id, string name, string domain, bool allowCookie){...}

         public ConfigudationBase CreateConfig( string id, string name, string domain, bool allowCookie, string url, string referenceUrl, ConfigType configTypeEnum){
          //call the expected factory method based on enum type.
         }
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9598942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档