关于工厂模式

2021-11-20 10:46:59 +08:00
 taofoo

之前在 这里 看到了一个关于享元模式的代码。

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 )

2096 次点击
所在节点    Java
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/816721

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX