java - 避免大量实例化 "MyObjectX extends AbstractObject"来调用每个 myObjectX.execute() ?设计模式 ?

标签 java design-patterns

这可能是一个奇怪的问题。

我正在设计一些代码......暂时看起来像这样:

abstract class MyAbstractObject {
  String param ;
  abstract void execute () ;
}

class MyObject1 extends MyAbstractObject {
  String otherParam ;
  void exectute() { // implementation } ;
}

class MyObject2 extends MyAbstractObject {
  void exectute() { // other implementation } ;
}

class useMyObject {
  void thisFunctionUsesMyObjects () {
    MyObject1 obj1 = new MyOject1(param1, param2) ;
    MyObject2 obj2 = new MyObject2(param1) ;
    obj1.execute() ;
    obj2.execute() ;
  }
  void thisFunctionToo () {
    MyObject1 obj1 = new MyOject1(param3, param2) ;
    MyObject2 obj2 = new MyObject2(param3) ; 
    // and we could have some more different MyObjectX as well...  
    MyObject3 obj3 = new MyObject3(param3) ;
    MyObject4 obj4 = new MyObject4(param3) ;

    // with an execution in another order
    obj1.execute() ;
    obj3.execute() ;
    obj2.execute() ;
    obj4.execute() ;
  }
}

我想知道是否有更好的方法来执行此类代码...考虑到我可以同时运行多个函数,例如 thisFunctionUsesMyObjects() (因此静态不能成为解决方案)。

我不知道为什么它让我烦恼......我认为事实上两个 MyObject(1,2) 总是具有相同的第一个参数,并且两者都只公开并调用了它们的execute()方法。

也许没有更好的办法了。

最佳答案

大概,您必须创建 MyObjectMyObject2 的新实例,因为 execute 方法不可重入并且实例不可重用。 (考虑到您通过构造函数参数为执行方法提供输入的方式,我看不出它有什么不同。)

您可以通过一些重写来改进代码:

    MyObject1 obj1 = new MyOject1(param3, param2) ;
    MyObject2 obj2 = new MyObject2(param3) ;
    obj1.execute() ;
    obj2.execute() ;

可以写成:

    new MyOject1(param3, param2).execute();
    new MyObject2(param3).execute();

然后你可以重构:

  void thisFunctionUsesMyObjects () {
    MyObject1 obj1 = new MyOject1(param1, param2) ;
    MyObject2 obj2 = new MyObject2(param1) ;
    obj1.execute() ;
    obj2.execute() ;
  }
  void thisFunctionToo () {
    MyObject1 obj1 = new MyOject1(param3, param2) ;
    MyObject2 obj2 = new MyObject2(param3) ;
    obj1.execute() ;
    obj2.execute() ;
  }

变成:

  void thisFunctionUsesMyObjects () {
    doIt(param1, param2);
  }

  void thisFunctionToo () {
    doIt(param3, param2);
  }

  private void doIt(p1, p2) {
    new MyOject1(p1, p2).execute();
    new MyObject2(p1).execute();
  }

显然,这种模式的实例越多,好处就越多。 OTOH,如果模式不像您的示例所示一致,则重构可能会更复杂。

关于java - 避免大量实例化 "MyObjectX extends AbstractObject"来调用每个 myObjectX.execute() ?设计模式 ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17022454/

相关文章:

java - BufferedImage 图像指针数据作为 C 函数的 JNI 参数

java - 在我的 Spring 上下文文件中找不到 "ehcache: annotation-driven"定义

java - 使用 JDK 6 中捆绑的 jax-rs 引用实现构建 Web 服务

java - 如何在Windows上构建Livy客户端?

.net - .NET 框架中使用的设计模式?

java - 基本java重构: Delegate the differences of child classes to parent and merge/remove them

django - 为什么在 Django 中检查两个密码是否匹配如此复杂?

javascript - 在 javascript 中应用设计模式有什么用?

java - 具有构建器模式的通用对象

java - 如何通过代码动态添加告警?