我正在开发一款小型java游戏,它是1995年游戏主题医院的一种克隆。 我最近一直在研究GUI和Level结构,现在我有路径查找和网格工作。 我目前的“构建东西”的方式包括一个房间和一个接待台,到目前为止它工作正常,但我需要实现一种方法来添加不同类型的房间和项目。 这是我按下按钮时的当前代码,用于创建对象(http://snipt.org/lUm)。
我确信必须有更好的方法来做到这一点!我知道,我的实现很差,但我最近才开始了解如何使用抽象类和接口。
实际上设置房间或项目的属性,我目前没有问题。我正在考虑未来,但我喜欢我对如何在Stack上做最好的事情有不同的看法。关于如何实现这样的事情的想法?这种事情有什么例子吗?我会搜索它,但我不确定要搜索什么,因为我不知道我正在做什么有一个确切的名字。
如果我不太清楚我在说什么,我很抱歉。我很乐意回答有关此问题的任何进一步问题,或者根据需要或要求上传更多代码段。
提前感谢您的时间和想法!
答案 0 :(得分:3)
查看factory pattern。工厂是一种通过提供参数来创建对象的方法,并且可以获取符合公共接口的对象。然而,实施由工厂决定。调用代码不需要知道这一点。
通过将对象构造封装在另一个对象(工厂)中,选择要构建的特定对象的机制将从调用代码中抽象出来。通过仅修改工厂本身,您可以在以后轻松提供更多子类。
因此,在您的示例代码中,buildMe()
方法是一种工厂形式。它需要一些参数来指定需要构建的内容 - Room
或ReceptionDesk
。这两个都将实现相同的接口(HospitalComponent
?),然后调用代码将该组件放在医院内。您可以将更多的HospitalComponent子类添加到工厂(OperatingTheatre
?),并且调用代码不必更改。
值得调查design patterns(在此方案中,查看此creational patterns列表)以了解使用对象解决常见问题的不同方法,以及如何与其他人沟通您的解决方案。 Gang-of-Four本书是本课程的圣经。
答案 1 :(得分:1)
多态性对于你正在做的事情可能有点过分。
就个人而言,我只会有一个Room类,其中包含每个建筑物的值表(最大尺寸,每块瓷砖的成本等)。然后,当您构建一个新房间时,获取匹配的表条目,并使用表中的详细信息创建Room对象。
这可能不是最好的做法,它可能违反Java惯例(我从动态语言来到Java)但是就需要更改以创建新房间的代码行而言,它是我发现的最低值
答案 2 :(得分:0)
你现在拥有的是一个带有一堆静态函数的类。它不是非常OOP - 该类只是一种将所有函数分组到一个文件中的方法。
如果你去OOP路线,你需要一个房间基础班,然后是OperatingRoom,ReceptionistDesk,浴室,办公室(工作人员),MRIRoom,WaitingRoom,甚至可能是Hall的儿童班。
public class Room {
protected int width, length; //how many squares wide/long the room is
protected int x, y; //where it is on the gride
protected float buildingProgress; //how far construction has come
protected bool isReady; //is the building ready for use?
protected Person occupants[]; //some list/array of people currently in the room
protected Person resident; //the person 'in charge' in the room--the receptionist, manager, MRI technician, etc etc.
}
答案 3 :(得分:0)
在使用多态性对此问题进行建模之前,我会仔细考虑。
问题是:每种类型的房间会有什么根本不同的行为?所有这些之间有什么共同之处?
多态性并不总是答案。组合有时可以使事情更加灵活。如前所述,数据驱动的解决方案可能是最好的。