在面向对象设计领域里,SOLID是很是经典的设计原则,能够认为它是道,设计模式是术,只有深入理解了道,才能用好术。下面简单总结一下SOLID原则:html
下面以工厂模式为例,说明一下SOLID原则在设计模式里的体现:
工厂模式属于建立型模式,主要分三种:java
我的以为第三种模式使用场景较少且比较鸡肋,主要介绍前两种。
先来看下简单工厂模式:设计模式
public abstract class Operation{ private double value1; private double value2; public double getValue1() { return value1; } public void setValue1(double value1) { this.value1 = value1; } public double getValue2() { return value2; } public void setValue2(double value2) { this.value2 = value2; } protected abstract double getResult(); } public class OperationAdd extends Operation { @Override protected double getResult(){ return getValue1() + getValue2(); } } public class OperationMinus extends Operation { @Override protected double getResult(){ return getValue1() - getValue2(); } } public class OperationMul extends Operation { @Override protected double getResult(){ return getValue1() * getValue2(); } } public class OperationFactory{ public static Operation createOperation(String operation){ Operation operation = null; switch(operation){ case "+": operation = new OperationAdd(); break; case "-": operation = new OperationMinus(); break; case "*": operation = new OperationMul(); break; default: throw new UnsupportedOperationException("Unsupported Operation:" + operation); } return operation; } }
首先,咱们必须令Operation的派生类遵循Liskov's Substitution Principle,才能放心的说,不管咱们在工厂中建立出哪一种Operation的派生类,都可以利用多态替换其后对Operation的引用。
其次,工厂模式返回抽象类,使调用工厂的高层模块依赖Operation这个抽象类而不是其某个具体的派生类,这知足了Dependency Inversion Principle。
可是,OperationFactory类中包含了全部Operation派生类的建立,后面若是不断的须要增长新的Operation派生类,就须要不断的修改OperationFactory,这违反了Open-Close Principle,就须要引入工厂方法模式:ide
public interface IFactory { Operation CreateOption(); } public class AddFactory implements IFactory { public Operation CreateOption() { return new OperationAdd(); } } public class MulFactory implements IFactory { public Operation CreateOption() { return new OperationMul(); } } public class SubFactory implements IFactory { public Operation CreateOption() { return new OperationSub(); } }
这样每当有新的Operation派生类,只须要对应新建新的工厂类就能够了,这其实也是将工厂类与其调用者用抽象层隔离了。但要注意这也会由于建立过多的类而难以管理。this