很多人都说简单工厂模式违反开闭原则,因为,如果新添加一个产品类,就需要修改工厂类中的代码。我觉得如果简单工厂模式违反开闭原则,那么工厂方法模式也违反了开闭原则。我的分析是这样的:(这是我的一个分析的文章,http://blog.csdn.net/tayanxunhua/article/details/10297013,大家如果觉得我是打广告的,那么可以不看,我在这里再解释一下)一个TV产品类,HaierTV和HisenseTV实现了这个类;
一个工厂类,还有一个测试类。工厂类的实现:
    public static TV getTV(String name) {  
      if (name.equals("Haier")) {  
          return new HaierTV();  
      } else if (name.equals("Hisense")) {  
          return new HisenseTV();  
      } else {  
          return null;  
      }  
    }  
这样肯定是违反开闭原则的,原因就不说了。
但是如果我这样修改呢?
    public static TV getTV(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException {  
        TV tv = (TV) Class.forName("com.tyxh.pattern.sample." + name).newInstance();  
        return tv;  
    }  修改了之后,是否还违反开闭原则呢?当然了,可能会有这种情况,现在有一个TV的产品类,如果我想再添加一个Fruit产品类,那么就需要修改工厂类的代码了吧。我觉得简单工厂模式确实违反了开闭原则,但是工厂方法模式是否又违反了开闭原则呢?我添加一个新的产品类的时候,不是也需要修改测试类的代码么?简单模式开闭原则

解决方案 »

  1.   

    可以看一下我这个分析对不对么?
    http://blog.csdn.net/tayanxunhua/article/details/10297013
      

  2.   

    您好,简单工厂模式中,如果在静态工厂方法里面不采用if..else逻辑,而是采用反射机制创建对象,那么对于工厂类来说还违反开闭原则了么?
      

  3.   

    其实想问一下楼主的例子中为什么新增Fruit产品,还要把它挤到TV工厂里面去,Fruit定义一个自己的工厂不是很好吗?既然TV下面有子类,Fruit加到这个结构中,不是不伦不类吗?对Fruit没法和TV的子类们同等对待。应该是另外新增一个TV的子类差不多吧
      

  4.   

    要想做好一个软件,不能单单一个设计模式就行的,就开闭原则来说,工厂方法加spring.net框架还是比较好的能实现开闭原则的,把要加载的内容放入xml或者app.config,这样在不用重新编译的情况下也可以修改加载项