设计原则及模式

本文深入探讨了软件设计中的六大原则,包括单一职责、里氏替换、依赖倒置、接口隔离、迪米特法则和开闭原则。同时,详细介绍了二十二种设计模式,如单例、原型、工厂方法、抽象工厂、建造者等,以及它们的应用场景。在结构型模式中,解释了代理、适配器、装饰者等模式,而在行为型模式中,重点阐述了模板方法、策略和命令模式。这些设计模式和原则是提高代码可读性、可维护性和灵活性的关键。
摘要由CSDN通过智能技术生成

目录

六大设计原则:

一、单一职责原则

二、里氏替换原则

三、依赖倒置原则

四、接口隔离原则

五、迪米特法则/最少知识原则

六、开闭原则

二十二种设计模式:

创建型模式:

一、单例(面试常问)

五种实现方式:

饿汉式(线程安全,调用效率高,但不能延时加载)常用

懒汉式(线程安全,调用效率不高,但是能延迟加载)

双重校验

静态内部类

枚举类

二、原型

使用场景:

三、工厂方法

四、抽象工厂

五、建造者

结构型设计模式:

一、代理

二、适配器

三、桥接(面试中基本不会问)

四、装饰者(偶尔)

五、门面

六、享元/蝇量(偶尔)面试几乎遇不到

七、组合(不经常用)

行为型模式(占比最高)

一、模板方法(重要)

二、策略(重要)

三、命令(重要)(中间件会用到)

四、责任链(不常见)(依赖)

五、状态(不常见)--->状态机

六、观察者(常见)

七、中介者(常见)

八、迭代器(会用但不用自己写)

九、访问者(少)面试会问

十、备忘录(少)

十一、解释器(少)


六大设计原则:

一、单一职责原则

一个类或者模块只负责完成一个职责

二、里氏替换原则

多用组合,少用继承

三、依赖倒置原则

下层模块引入上层模块的依赖,改变原有自上而下的依赖方向(spring ioc)

四、接口隔离原则

建立单一接口,接口尽量细化,接口中的方法尽量少

五、迪米特法则/最少知识原则

一个类对自己需要耦合或调用的类知道的越少越好

六、开闭原则

对扩展开放,对修改关闭

添加一个功能应该是在已有的代码基础上进行扩展,而不是修改已有的代码。

二十二种设计模式:

概述:

创建型模式:单例、原型、工厂方法、抽象工厂、建造者

结构型模式:代理、适配器、桥接、装饰者、门面、享元、组合

行为型模式:命令、迭代器、观察者、策略、模板、职责链、状态、访问者、中介者、备忘录、解释器

创建型模式:

“怎样创建对象”“将对象的创建和使用分离”

一、单例(面试常问)

确保一个类只有一个实例(反射setAccessible(true)可以访问私有构造方法newInstance()创建另外一个对象,反序列化可以破坏单例)

五种实现方式:

饿汉式(线程安全,调用效率高,但不能延时加载)常用

public class SingletonDemo{

    private static SingletonDemo instance = new SingletonDemo();

    private SingletonDemo(){

    }

    public static SingletonDemo getInstance() { return instance; }
}
    

懒汉式(线程安全,调用效率不高,但是能延迟加载)

public class SingletonDemo {

    //类初始化时,不初始化这个对象(延迟加载,真正用的时候再创建)
    private SingletonDemo instance;

    //构造器私有化
    private SingletonDemo(){

    }

    //方法同步调用效率低
    public static synchronized SingletonDemo getInstance(){
        if(instance == null){
            instance = new SingletonDemo();
        }
        return instance;
    }
}

双重校验

public class SingletonDemo {

    private volatile static SingletonDemo instance;

    private SingletonDemo(){

    }

    public static SingletonDemo getInstance(){
        if(instance == null){
            synchronized(SingletonDemo.class){
                if(instance == null){
                    instance = new SingletonDemo();
                }
            }
        }
        return instance;
    }
}

静态内部类

枚举类

利用枚举类本身就是单例

二、原型

不通过new关键字来产生一个对象,而是通过对象复制(clone或反序列化)来实现。

clone()方法不执行构造函数,直接在内存种拷贝。

clone()为浅拷贝(例如容器类)深拷贝需要重写。

使用场景:

  • 类的初始化需要消耗非常多的资源。
  • 通过new产生一个对象需要非常繁琐的数据准备或访问。
  • 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值。

三、工厂方法

定义了一个创建对象的接口,但由子类确定要实例化的类是哪一个。工厂方法把实例化推迟到子类。通过抽象方法提供对象生成入口。

四、抽象工厂

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。通过接口来创建一组产品。

五、建造者

可以封装一个产品的构造过程,并允许按步骤构造产品。将一个复杂的对象分解成多个相对简单的部分,然后根据不同需要分别创建他们,最后构建成该复杂对象。

结构型设计模式:

如何将类或对象按某种布局组成更大的结构。

分为类结构型模式(采用继承机制来组织接口和类)和对象结构型模式(采用组合或聚合来组合对象)

一、代理

为某对象提供一种代理以控制对该对象的访问。

二、适配器

将类的接口转换成客户希望的另一个接口

三、桥接(面试中基本不会问)

将抽象与实现分离,使他们可以独立变化。

优点:将实现解耦,抽象和实现可以独立扩展,不会影响到对方

对于“具体地抽象类”所做的改变,不会影响到客户。

用途:

适合使用在需要跨越多个平台的图形和窗口系统上

适合需要用不同的方式改变接口和实现

缺点:增加了复杂度

四、装饰者(偶尔)

动态地给对象增加一些职责,即增加其额外的功能。动态地将责任附加到对象上。

五、门面

为多个复杂的子系统提供一个一致的接口,使这些子接口更容易被访问

六、享元/蝇量(偶尔)面试几乎遇不到

运用共享对象来有效地支持大量细粒度对象的复用。对象小量大的场景

七、组合(不经常用)

将对象组成树状层次结构

行为型模式(占比最高)

描述程序在运行时复杂的流程控制,类和对象之间怎样相互协作完成单个对象无法单独完成的任务。分为类行为模式(继承)对象行为模式(组合)

一、模板方法(重要)

在一个方法中定义一个算法骨架,将一些实现步骤延迟到子类中。

二、策略(重要)

定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

三、命令(重要)(中间件会用到)

将“请求”封装成命令对象,以便使用不同的请求、队列或日志来参数化其他对象。例子:智能家居遥控器控制不同电器。

四、责任链(不常见)(依赖)

当想要一个以上的对象有机会能够处理某个请求的时候,就使用责任链。使多个对象都有机会处理请求,避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理为止。

五、状态(不常见)--->状态机

允许对象在内部状态改变时改变它的行为。

六、观察者(常见)

定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

七、中介者(常见)

集中相关对象之间复杂的沟通和控制方法。

八、迭代器(会用但不用自己写)

提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

九、访问者(少)面试会问

作用于某个对象的各个元素的操作。可以在不改变各元素的类的前提下定义作用于这些元素的新操作(在不同visitor操作)。例如:不同人群买苹果电脑。

十、备忘录(少)

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。当需要让对象返回之前的状态时,就使用备忘录模式。Stack实现。

十一、解释器(少)

提供如何定义语言的文法,以及对语言句子的解释方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值