哪种编程模式是首选

时间:2018-01-07 12:22:16

标签: design-patterns

如果我有一个类,其中的所有函数都需要首先通过检查,那么以下哪个是更优选的

1

class check{
   public check(Status){
    if(CheckFunc(Status)){
       // Passed the Check function and return a class instance
       return new UpdateClass();
    }
}

class UpdateClass{
   public void Func1(){     
    // Do the stuff
   }
   // Other functions...
}

OR

2

class UpdateClass{
    boolean passedCheck = false;
    public UpdateClass(Status){
        if(checkFunc(Status)){
            this.passedCheck = true;
        }
    }
    public void Func1(){
        if(this.passedCheck){
        // Do the stuff
        ...
        }
    }
    // Other functions...
}

另外,使用类/函数决定要实例化哪个类是一种好方法吗?

例如:

    public Animal decideWhichClass(Status){
        if(Status == StatusA){
            return new Dog();
        }
        else if (Status == StatusB){
        return new Cat();
        }
    }

    Animal a = decideWhichClass(CurrentStatus);

1 个答案:

答案 0 :(得分:1)

第一个问题)检查是更新处理的要求 在第一种方式中,您没有这种保证,因为UpdateClass可以在不通过支票的情况下创建和使用。

第二个更好,因为它阻止绕过检查:

public UpdateClass(Status){
    if(checkFunc(Status)){
        this.passedCheck = true;
    }
}
  

此外,使用类/函数决定使用哪个类是一种好方法   要实例化?

示例很宽泛但是可以接受factory个实例化的子类依赖于特定参数的对象。
请注意,为避免if/elseIf,该函数可能依赖于Map结构 这是Java中的一个示例(但您可以在任何Object语言中获得类似的东西):

public class AnimalFactory{

   private static Map<Status, Supplier<Animal>> map = new HashMap<>();

   private AnimalFactory(){      
   }

   static {
     map.put(Status.A, Dog::new);
     map.put(Status.B, Cat::new);
   }

   public static Animal ofAnimal(Status status){ 
     return map.get(status).get(); 
     // of course you should also handle the error case : no association found
   }
}


 //Client code
Animal a = AnimalFactory.ofAnimal(Status.B);