Java:使单身人士更加冗长

时间:2014-12-18 19:42:29

标签: java oop design-patterns interface singleton

为了帮助我学习Java和编程概念,我正在编写一个可以解决游戏中PuzzleFreak难题的机器人。

我让游戏的控制器成为单身人士,因为应该只有一个。但是,现在我到处都是Controller.getInstance()。我怎么能让这个更简洁? Singleton甚至可以去这里吗?

我可以将控制器方法包装在默认方法中,这样我就可以在click(x,y)实现中调用Player,但这感觉不对。

下面我有播放器界面和示例实现。

Player.java:

public interface Player {

default void giveUp() {
    Controller.getInstance().click(new Rectangle(704, 545, 64, 18));
    Controller.getInstance().delay(0.1);
    Controller.getInstance().click(new Rectangle(704, 545, 64, 18));
}

default void play() {
    giveUp();
}
}

StartupPlayer.java:

public class StartupPlayer implements Player {

public void play(){
    Controller.getInstance().click(60, 278);
    Controller.getInstance().delay(0.5);
    Controller.getInstance().type("KevinBot");
    Controller.getInstance().delay(0.5);
    Controller.getInstance().click(400, 463);
}
}

4 个答案:

答案 0 :(得分:2)

只需声明一个本地控制器并拨打getInstance()一次:

例如:

public class StartupPlayer implements Player {
    public void play(){
        Controller controller = Controller.getInstance()
        controller.click(60, 278);
        controller.delay(0.5);
        controller.type("KevinBot");
        controller.delay(0.5);
        controller.click(400, 463);
    }
}

答案 1 :(得分:1)

在界面中,您可以通过getter获取控制器:

public interface Player {

  default void giveUp() {
    Controller controller = getController();
    controller.click(new Rectangle(704, 545, 64, 18));
    controller.delay(0.1);
    controller.click(new Rectangle(704, 545, 64, 18));
  }

  default void play() {
    giveUp();
  }

  default Controller getController() {
    return Controller.getInstance();
  }

}

然后,实现类也使用getter:

public class StartupPlayer implements Player {

  public void play(){
    Controller controller = getController();
    controller.click(60, 278);
    controller.delay(0.5);
    controller.type("KevinBot");
    controller.delay(0.5);
    controller.click(400, 463);
  }

}

通过这种方式,以后更容易更改单身人士的决定。

此外,如果您要连续调用许多控制器方法,您可以考虑将其设为fluent interface,并将getter重命名为controller(我认为它会使其更多也很流利,你有:

public interface Player {

  default void giveUp() {
    controller().
      click(new Rectangle(704, 545, 64, 18)).
      delay(0.1).
      click(new Rectangle(704, 545, 64, 18));
  }

  default void play() {
    giveUp();
  }

  default Controller controller() {
    return Controller.getInstance();
  }

}

public class StartupPlayer implements Player {

  public void play(){
    controller().
      click(60, 278).
      delay(0.5).
      type("KevinBot").
      delay(0.5).
      click(400, 463);
  }

}

这进一步减少了详细程度......

而且,如果您在play的界面中提供的默认实现真的意味着每次都被覆盖,那么您应该考虑将其保持抽象。方法giveUp仍可用于实现要使用的类。

答案 2 :(得分:0)

将其设置为目标上下文(类)中的变量;即使在变量中,它也是同一个实例。只是对同一个实例的不同引用。

答案 3 :(得分:0)

您可以使用名为 SigletonEnum 的公共枚举,其中包含一个名为 INSTANCE 的实例。 这是一个单身人士。

由于这是枚举,因此不需要实例化。然后在应用程序中,您可以将其称为

SingletonEnum.INSTANCE.doSomething();