之前在 这里 看到了一个关于享元模式的代码。
import java.util.HashMap;
public class ShapeFactory {
private static final HashMap<String, Shape> circleMap = new HashMap<>();
public static Shape getCircle(String color) { // 这里没有看懂, 既然已经知道返回的是一个 Circle ,为什么还要转成 Shape
Circle circle = (Circle)circleMap.get(color);
return circle;
}
}
...
// 使用的代码,又把 Shape 转成了 Circle
(Circle)ShapeFactory.getCircle(getRandomColor());
不过,我想说的可能脱离了享元模式。在 ShapeFactory 中 getCircle() 很明确的指出获得的是 Circle ,为什么还要转换成 Shape,用的时候再转换成 Circle ,这样做的目的是什么呢?我没有想明白。(另外 Circle 实现了 Shape,再 Circle 向上转型为 Shape 的时候不会出现问题,那么 Circle 可以直接视为 Shape )。就 ShapeFactory 而言,抽象和多态的目的在于以后可能会出现额外的 Shape 。所以不太明白,getCircle()方法的意义。
总结下问题:1. 抽象的 ShapeFactory 为什么会有 getCircle()方法。(可能是方便) 2.getCircle()返回的是 Shape (既然明确了是 Circle,为什么还要转成 Shape )
1
lxychn 2021-11-20 16:20:31 +08:00
1. Circle 是 Shape 的实现,只有 Circle 才能创建实例,所以 ShapFactory 可以有 getCircle()
2. 我觉得返回是 Circle 也没有什么问题,不过一般来讲什么 Factory 就返回什么,比如饮料厂生产饮料,玩具厂生产玩具。。饮料有具体类型比如可乐,雪碧,芬达,但统称饮料。编程上通常来讲,我们不太关心具体实现类型,只关心 Interface 。这种 Shape 的例子其实不太好,List 的不同实现更好理解,不管 ArrayList ,LinkedList ,通常用 List 指代实例,出参入参都用 List ,修改实现方式的时候很方便。有条设计理念是 Coding to interfaces, not implementation |