V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sponsored by
LinkedIn
不坐班的神仙工作 · 去任何你想去的地方远程,赚一线城市的工资
2000 个不用出门 Social 的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
taofoo
V2EX  ›  Java

关于工厂模式

  •  
  •   taofoo · 312 天前 · 1635 次点击
    这是一个创建于 312 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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 条回复    2021-11-20 16:20:31 +08:00
    lxychn
        1
    lxychn  
       312 天前
    1. Circle 是 Shape 的实现,只有 Circle 才能创建实例,所以 ShapFactory 可以有 getCircle()
    2. 我觉得返回是 Circle 也没有什么问题,不过一般来讲什么 Factory 就返回什么,比如饮料厂生产饮料,玩具厂生产玩具。。饮料有具体类型比如可乐,雪碧,芬达,但统称饮料。编程上通常来讲,我们不太关心具体实现类型,只关心 Interface 。这种 Shape 的例子其实不太好,List 的不同实现更好理解,不管 ArrayList ,LinkedList ,通常用 List 指代实例,出参入参都用 List ,修改实现方式的时候很方便。有条设计理念是 Coding to interfaces, not implementation
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2877 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 177ms · UTC 13:58 · PVG 21:58 · LAX 06:58 · JFK 09:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.