我需要询问用户他想要绘制的图有多少边,然后调用正确的构造函数来实例化对象。
下面是我尝试使用IF语句解决答案(或者我可以使用开关),但我不知道这是否是最好的方法,可能是Java继承和多态。
所有类都扩展了类图。
课程图
IMAGE
MAIN CLASS:
<defs>
<pattern id="pattern" width="1600" height="800" patternUnits="userSpaceOnUse">
<image xlink:href="http://lorempixel.com/1600/800/nature" width="1600" height="800" />
</pattern>
</defs>
#container svg {
stroke:url(#pattern);
}
课程代码:
--------------- Figure ---------------
^ ^ ^ ^
| | | |
| | | |
Circle Triangle Rectangle Exagone
答案 0 :(得分:10)
您是否考虑过Factory Method Pattern?基本上,你有一个像这样的方法:
public Figure createInstance(int numSides) {
Figure figure = null;
switch(numSides) {
case 0:
figure = new Circle();
break;
case 3:
// etc...
// Make a case for each valid number of sides
// Don't forget to put a "break;" after each case!
default:
// Not a valid shape; print your error message
}
return figure;
}
让工厂方法做出决定。
答案 1 :(得分:4)
这是何时使用factory design method的一个很好的例子。标准是有一个工厂类,它确定要调用的构造函数,然后返回该对象。就个人而言,我倾向于把它推到基类的静态方法中(随意评论为什么这可能是坏的)。
答案 2 :(得分:4)
解决此问题的一种方法是将一个工厂方法添加到Figure类中以构建其他数字。这会将代码保存在一个地方,并且可以很容易地用于图的客户端。
class Figure{
private int sides;
/* package */ Figure(int num_sides){
sides = num_sides;
}
public static Figure createFigure(int num_sides) {
if (num_sides == 0) {
return new Circle();
} else if (num_sides == 4) {
return new Square();
}
throw new IllegalArgumentException("Invalid number of sides");
}
}
class Circle extends Figure{
public Circle(){
super(0);
}
}
class Square extends Figure{
public Square(){
super(4);
}
}
答案 3 :(得分:2)
您使用的IF不是嵌套的,嵌套的示例如果是:
if(condition1) {
if(con2)
//body
}
在性能方面,通常使用更好:switch-case。既然在这里你没有这么多的情况,else if
就可以做到这一点,但是要知道,由于JVM,switch
在更多情况下效率更高。
答案 4 :(得分:1)
我会按建议使用Factory设计模式,但是我也会在边数为&gt;的情况下制作一个通用构造函数。 0以边数作为参数。想一想:您可以将360度或2个PI rad除以边数,并将角绘制在虚拟圆上。重复使用您的代码并使所有可能的边数都成为可能,圆圈为0的显着例外。
答案 5 :(得分:1)
您的方法建议您有一个具有属性的类,该属性确定要创建的图的边数,而不是每个图的单独类。然后向用户询问边数是否合理,你可以将数字传递给你的Multigon的构造函数并完成它。这似乎是更好的模型,因为没有专业化或扩展需要考虑,只是一个不同的数量。你的数字都属于同一类,它们都是以连续的方式分成几个步骤。耙子将是一个不同的类别,就像一个十字架。
此外,我认为圆圈有一面。一条线有两个(将被绘制和向后),下一个将是三角形。零将是一个点。
但是要回答你的问题,switch语句会比if更好。毕竟,你想处理案件,而不是条件。