假设我有一个类resources
,它实例化我的所有OpenGL / Java游戏对象,然后我将这些通过构造函数传递给我的Scene类(需要它们),就像这样(简化示例)...... ..
public class Resources {
Hero hero;
Enemy enemy;
MenuButtons mainMenuButtons;
Background background;
Scene mainMenu;
public void createObjects(){
hero = new Hero();
enemy = new Enemy();
mainMenuButtons = new MenuButtons();
background = new Background();
mainMenu = new Scene(hero, enemy, mainMenuButtons, background);
}
}
显然,我的Scene的构造函数需要采用4个参数:
public class MainMenu implements Scene {
hero Hero;
enemy Enemy;
mainMenuButtons MenuButtons;
background Background;
public MainMenu(Hero hero, Enemy enemy, MainMenuButtons mainMenuButtons, Background background){
this.hero = hero;
this.enemy = enemy;
this.mainMenuButtons = mainMenuButtons;
this.background = background;
}
}
随着需要更多对象,构造函数变得越来越长。现在让我们说我做了类似下面的事情:
public class MainMenu implements Scene {
Resources resources;
public MainMenu(Resources resources){
this.hero = resources.hero;
this.enemy = resources.enemy;
this.mainMenuButtons = resources.mainMenuButtons;
this.background = resources.background;
}
}
这两个选项都允许我在mainMenuScene中使用对象,如下所示:
hero.move();
第二个似乎有点整洁,因为构造函数永远不需要采取任何额外的参数。 然而据我所知,我从来没有见过这样的例子。这是一种有效的技术吗?我会遇到使用它的问题吗?
答案 0 :(得分:2)
简答: - 是的,该技术是有效的,它应该可以正常工作。
更长的部分: -
我想建议两种设计方法来考虑
essence模式
fluent界面模式
这两者的意图相似。
此外,构建器模式也很有用。我们多次使用hibernate看到它。对于你的课程,它可能如下: -
static
然后你可以使用下面的链接来创建对象: -
public class mainMenu implements Scene {
private Hero hero;
private Enemy enemy;
private MenuButtons mainMenuButtons;
private Background background;
public mainMenu setHero(Hero hero){this.hero = hero; return this}
public mainMenu setEnemy(Enemy enemy){this.enemy = enemy; return this}
public mainMenu setMainMenuButtons(MenuButtons mainMenuButtons){this.mainMenuButtons = mainMenuButtons; return this}
public mainMenu setBackground(Background background){this.background = background; return this}
}
P.S。即使你不想使用上述模式,我也建议三种变化或习惯
1.班级名称以大写字母和
开头
2.按字母顺序组织论点的惯例
3.您可能希望将成员的访问级别设置为私有。
答案 1 :(得分:1)
我喜欢它。而不是Resources
,我喜欢将其称为ApplicationContext
并使用相同的方式。
我因创建"God Object"而受到批评。我不同意这一点。只要ApplicationContext很薄并且只保存对象,但对它们一无所知(调用任何方法),那就没关系。它可以被List或Map替换,除了我喜欢附加的类型检查。
请参阅Service Locator模式以了解其他方法。