c# - 关于工厂设计架构的问题

标签 c# design-patterns architecture interface factory-pattern

考虑这个例子

界面

interface IBusinessRules
{
    string Perform();
}

继承者

class Client1BusinessRules: IBusinessRules
{
    public string Perform()
    {
        return "Business rule for Client 1 Performed";
    }
}

class Client2BusinessRules: IBusinessRules
{
    public string Perform()
    {
        return "Business rule for Client 2 Performed";
    }
}

class Client3BusinessRules: IBusinessRules
{
    public string Perform()
    {
        return "Business rule for Client 3 Performed";
    }
}

工厂类

class BusinessRulesFactory
{
    public IBusinessRules GetObject(int clientIdentityCode)
    {
        IBusinessRules objbase = null;
        switch (clientIdentityCode)
        {
            case 1:
                objbase = new Client1BusinessRules();
                break;
            case 2:
                objbase = new Client2BusinessRules();
                break;
            case 3:
                objbase = new Client3BusinessRules();
                break;
            default:
                throw new Exception("Unknown Object");
        }
        return objbase;
    }
}

示例用法:

class Program
{
    static void Main(string[] args)
    {
        BusinessRulesFactory objfactory = new BusinessRulesFactory ();
        IBusinessRulesFactory objBase = objfactory.GetObject(2);
        Console.WriteLine(objBase.Perform());

        objBase = objfactory.GetObject(3);
        Console.WriteLine(objBase.Perform());
        Console.Read();
    }
}

我的问题是,我如何在 ALgorithm1 类上添加另一个方法 但不在界面中,因为我只是在特殊情况下使用它?

class Client1BusinessRules: IBusinessRules
{
    public string Perform()
    {
        return "Client1 Business rules is Performed";
    }


    public string Calculate()
    {
        return "Additional functionality for CLient1";
    }
}

我应该如何在 UI 上这样调用它

 objBase = objfactory.GetObject(1);
 Console.WriteLine(objBase.Calculate());

还有其他解决办法吗?提前致谢

EDIT: I rewrite it to resemble my current project design

最佳答案

我假设您使用工厂类是为了:

  • 有一个标准外观接受导致业务规则选择配置的参数
  • 封装业务规则配置
  • 将用户与 IBusinessRules 的实际实现分离

因此我会通过引入新界面来解决你的问题

interface IComputableRules : IBusinessRules
{
    string Calculate();
}

只要遵循基于接口(interface)的设计,将实际实例转换为不同于IBusinessRules 的接口(interface)就没有错。

IBusinessRules businessRule = objFactory.GetObject(...some input...)
...
// check if the computable service is supported and print the result
IComputableRules computable = businessRule as IComputableRules;
if (computable)
{
     Console.WriteLine(computable.Calculate());
}

在这里,您可以将业务规则类视为服务提供者,它保证一些基本服务,以及根据业务规则的性质提供的可选附加服务。

注意:通过将 BusinessRulesFactory 转换为通用类,您可以将特定服务的指示作为工厂契约的一部分,并确保返回的业务规则实现将支持特定的(否则可选)服务。

class BusinessRulesFactory<TService> where TService : IBusinessRules
{
     public TService GetObject(int clientIdentityCode)
     {
         // ... choose business rule in respect to both clientIdentityCode and TService
     }
}

如果您不需要特定的附加服务可用,您只需使用 IBusinessRules 作为实际类型参数。

关于c# - 关于工厂设计架构的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3694145/

相关文章:

c# - MONO 的多门户 CMS

java - 如何删除注册/添加的监听器?

.net - "Software Parts"数据库

c# - DbSet.Attach 试图为生成的标识列插入显式值

c# - 使用泛型的扩展方法

java - 这种类型的编程构造/设计/模式的名称?

java - Java中如何获取匹配的字符串?

android - 整洁架构 : share same models/entities with different layers

xcode - 导入包含 OPENCV 函数的静态库时为 "Undefined symbols for architecture armv7"

c# - 许可证执行系统在调用 wkhtmltopdf.exe 时被篡改 - win server 2008