SOLID设计原则与工厂模式

栏目: 后端 · 发布时间: 7年前

内容简介:在面向对象设计领域里,SOLID是非常经典的设计原则,可以认为它是道,设计模式是术,只有深刻理解了道,才能用好术。下面简单总结一下SOLID原则:下面以工厂模式为例,说明一下SOLID原则在设计模式里的体现:工厂模式属于创建型模式,主要分三种:

在面向对象设计领域里,SOLID是非常经典的设计原则,可以认为它是道,设计模式是术,只有深刻理解了道,才能用好术。下面简单总结一下SOLID原则:

  • Single Responsibility Principle: 每个类只能有一个被修改的原因
  • Open-Close Principle: 对扩展开发,对修改关闭
  • Liskov's Substitution Principle: 派生类必须能够完全替换基类 Liskov's Substitution Principle(LSP)
  • Interface Segregation Principle:客户端不应该被强制依赖他们不需要使用的接口
  • Dependency Inversion Principle: 高层次的模块不应该依赖低层次的模块, 双方都应该依赖抽象。抽象不应该依赖具体细节。细节应该依赖抽象。 Dependency Inversion Principle

下面以工厂模式为例,说明一下SOLID原则在 设计模式 里的体现:

工厂模式属于创建型模式,主要分三种:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

个人觉得第三种模式使用场景较少且比较鸡肋,主要介绍前两种。

先来看下简单工厂模式:

SOLID设计原则与工厂模式

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,就需要引入工厂方法模式:

SOLID设计原则与工厂模式

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派生类,只需要对应新建新的工厂类就可以了,这其实也是将工厂类与其调用者用抽象层隔离了。但要注意这也会因为创建过多的类而难以管理。


以上所述就是小编给大家介绍的《SOLID设计原则与工厂模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

函数响应式领域建模

函数响应式领域建模

【美】Debasish Ghosh / 李源 / 电子工业出版社 / 2018-1 / 79

传统的分布式应用不会切入微服务、快速数据及传感器网络的响应式世界。为了捕获这些应用的动态联系及依赖,我们需要使用另外一种方式来进行领域建模。由纯函数构成的领域模型是以一种更加自然的方式来反映一个响应式系统内的处理流程,同时它也直接映射到了相应的技术和模式,比如Akka、CQRS 以及事件溯源。《函数响应式领域建模》讲述了响应式系统中建立领域模型所需要的通用且可重用的技巧——首先介绍了函数式编程和响......一起来看看 《函数响应式领域建模》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具