c# - 过于复杂的工厂方法 - 任何解决方案?

标签 c# java design-patterns

在创建某些对象系列时,工厂方法是隐藏复杂性的好方法。美好的。但是当工厂方法本身开始变得复杂时会发生什么?

例如,我需要创建一个基于两个或多个标志/属性/值的对象,如下所示:

public class MyClassFactory 
{
    public static IMyClass GetClass(int prop1, int prop2, int prop3)
    {
        switch(prop1)
        {
         case (1):
            switch(prop2) 
            {
                case(1):
                if(prop3 == x)
                    return new ImplMyClassA();
                else
                    return new ImplMyClassB();
                ... 
                //etc ad infinitum 
            }
        }
    }
}

这很快就会变得丑陋。好的,所以您向客户隐藏了复杂性,但您的工厂代码正在成为维护的难题。

这个问题还有哪些其他解决方案?是否有某种多值查找模式可以使它更容易阅读和维护?

最佳答案

把这些碎片放在一起。 :)

匿名创建者的参数映射。

Class propertySet{

  int prop1
  int prop2
  int prop3

  public equals(..){... }
}

interface creator {
   IMyClass create()
}

Map<propertySet, classCreator> creatorsMap = new HashMap();

static {

creatorsMap.add(new propertySet(1,2,3), new creator() { ... create() {return ImplMyClassA(); } });
......
creatorsMap.add(new propertySet(7,8,9), new creator() { ... create() {return ImplMyClassB();} });

}


public IMyClass create(x,y,z) {
   return creatorsMap.get(new propertySet(x,y,z)).create()
}

关于c# - 过于复杂的工厂方法 - 任何解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5818952/

相关文章:

Java - 如何打开位于 jar 文件中的文件

c# - 如何允许对私有(private)集合进行迭代但不允许修改?

java - OOPS ( JAVA ) 中的类设计

design-patterns - 有没有不好的设计模式?

c# - Entity Framework 具有相同键的两个不同对象不起作用

java - 如何创建一项具有变化数据的 Activity ?

c# - GUID 是(临时)加密的好 key 吗?

java - 使用 Scene Builder 创建 JavaFX TreeView

c# - OSx 单声道 gtk Hello World 。 Gtk.Container 抛出异常

c# - 如何在 datagridview C# 中格式化位数据类型列?