代码之家  ›  专栏  ›  技术社区  ›  Todd Ropog

工厂方法模式是否违反了打开/关闭原则?

  •  8
  • Todd Ropog  · 技术社区  · 15 年前

    是吗 Factory Method pattern (不要与工厂或抽象工厂模式混淆)违反 Open/Closed principle

    更新: 为了澄清,我指的是一个具体类上有静态工厂方法的场景。例如(来自FMP上的Wikipedia页面):

    class Complex 
    {
        public static Complex fromCartesian(double real, double imag) {
            return new Complex(real, imag);
        }
    
        public static Complex fromPolar(double modulus, double angle) {
            return new Complex(modulus * cos(angle), modulus * sin(angle));
        }
    
        private Complex(double a, double b) {
           //...
        }
    }
    

    难道不需要修改类来支持新的工厂方法吗?例如,如果类最初只有fromcortesian,后来需要fromPolar,那么不需要修改类来支持它吗?

    这两个不是都违反了开/关吗?

    3 回复  |  直到 15 年前
        1
  •  6
  •   Brian T Hannan    15 年前

    不,它完全没有违反开/关原则。

    工厂方法模式将根据指定的参数创建不同类型的对象。如果操作正确,工厂方法实际上可以很好地与打开/关闭原则配合使用。但是,如果创建一个新类,然后希望工厂方法创建该类型的新对象,则必须更改工厂方法。

    虽然,如果你有某种配置文件或者类似的东西被工厂方法读入,那么你就不必改变工厂方法。。。只需要一个配置文件,它指示工厂方法将创建什么对象。

        2
  •  4
  •   8bitjunkie Vikram    10 年前

    工厂模式本身并不违反 OCP

    怎样 你的行为 Complex 更进一步。

    如果 需要支持生产新型的 复杂 对象,然后选择修改 复杂 fromX 方法来支持它们,这意味着 复杂 OCP公司 复杂 必须重新打开进行修改:

    class Complex 
    {
        public static Complex fromCartesian(double real, double imag) {
            return new Complex(real, imag);
        }
    
        public static Complex fromPolar(double modulus, double angle) {
            return new Complex(modulus * cos(angle), modulus * sin(angle));
        }
    
        //class opened for modification
        public static Complex fromOtherMeans(String x , String y) {
            return new Complex(x, y);
        }
    }
    

    您可以将这个问题下推到某种文本文件或属性文件中,以免除您必须更改java类的责任,但这并不妨碍您必须在解决方案的这个区域编写额外的逻辑来支持新类型的类 复杂

    复杂

    一个这样的 OCP公司 友好的选择是子类 复杂 提供额外的工厂方法。子类是如何 复杂 已扩展但未修改。

    另一个 OCP公司 复杂 在这种情况下是 Decorator pattern . 连续装饰 复杂 有能力创造新的 尊重OCP因为 复杂 未修改,但通过使用新功能对其进行包装进行了扩展。

    复杂 所以它的计算是由成分提供的。这将为您提供使用 Strategy pattern 区分…的不同行为 复杂

    OCP公司 . 你可以使用上面的一种技巧来保持身体的右侧 OCP公司 但是你的同事可能会看一眼对象图,质疑在一个工厂上建立一个对象图是否明智,然后把它简化成一个工厂,这就回到了第一个例子。

    SOLID 原则,考虑你为什么要使用它

        3
  •  2
  •   noah    15 年前

    不。从你的维基百科链接: