设计模式
含义
是前辈们对代码开发经验的总结,是解决特定问题的一系列方案(针对面向对象)。
分类(共23种)
创建型模式
定义
描述怎么创建对象,让创建和使用分离,让代码更好的维护和扩展。
包含
5种:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式。
结构型模式
定义
从程序的结构上实现松耦合,使得类或者对象可以按某种布局组成更大的结构,解决复杂的问题
包含
7种:适配器模式,桥接模式,装饰模式,组合模式、外观模式,享元模式,代理模式
行为型模式
定义
让类或对象之间更好的相互协作
包含
11种:模板方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,解释器模式,状态模式,策略模式,职责链模式,访问者模式。
面向对象七大原则(oop)
开闭原则:对扩展开放,对修改关闭
单一职责原则:如引起类改变只有一个原因
接口隔离原则:要为各个类建立它们需要的专用接口
里氏替换原则:确保父类性质在子类中仍然成立
依赖倒置原则:要面向接口编程,不要面向实现编程。
合成复用原则:先考虑通过接口来实现(有没有),其次才考虑使用继承关系来实现(是不是)
迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话。(朋友指的是成员变量或方法输入输出的对象)
创建型模式例子
单例模式
定义
通过私有构造函数,确保一个类只有一个实例存在。
表现形式
饿汉式单例
类加载时就创建对象,如果不使用就造成资源浪费。(线程安全)
懒汉式单例
使用时再创建对象(线程不安全,如多个线程同时创建对象)
DCL懒汉式(双重检测锁模式的懒汉式单例)
双重检查锁DCL作用:尽可能减少加锁的范围(锁如果加在第一重,初始化除了创建对象可能还涉及其他赋值操作,所以加锁范围太大。在初始化中创建 对象为什么还要二重检查?因为第一重检查未加锁,所以可能导致多个线程都判断对象为空,从而进入初始化方法,依次创建多个对象)
静态内部类单例(将实例放在静态内部类中,比较少用)
反射可以破解单例(反射不能破解枚举单例,底层会进行判断)
工厂模式
定义
实现了创建者和调用者分离。让代码更好的维护和扩展
分类
简单工厂模式
工厂类通过不同参数创建不同对象(两个产品都继承抽象产品类,产品工厂通过参数返回不同产品)
举例:多个具体型号车继承一个抽象的车类,创建一个车工厂,根据参数创建具体型号的车然后返回。(缺点就是没有满足开闭原则,比如新增一类车时,需要在车工厂里新增代码。解决方法就是通过工厂方法模式)
模板
工厂方法模式
相对于简单工厂,为了满足开闭原则。
例子:先创建一个抽象工厂类,再给每个类型的车都创建一个工厂类(实现了了抽象工厂类),然后就可以通过抽象工厂类创建一个具体类别的工厂,再通过具体工厂创建对应类别的车,新增一个车品牌的时候之间创建一个新的工厂即可。但是工厂方法模式会新增很多类,在编程和结构复杂度上太复杂,所以一般还是优先选择简单工厂模式。
模板
抽象工厂模式
创建一个工厂的工厂。适用于涉及产品族的时候。缺点:不满足开闭原则,就是增加功能会修改代码。所以一般用于功能固定的产品族。
例子:比如小米和华为时两个产品族,都可以创建手机或者电脑。这时我们可以创建一个工厂的工厂,可以通过它创建华为工厂和小米工厂,小米工厂和华为工厂又可以创建手机和路由器
模板
结构型模式
适配器模式
通过引入适配器将原本接口不兼容的类能一起工作。(一般采用对象适配器,不采用类适配器,对象适配器可以通过多态实现多种类型的适配)
例子:如电脑上只有usb接口,插不上网线接口,通过引入一个转接器(适配器)将电脑接上网线。
桥接模式
适用于多维度的场景,将每个维度分离,使它们都可以独立的变化,再通过桥接把不同维度组装成起来。
例子:比如品牌和电脑的组合,新增一个品牌时,电脑和品牌的组合就会多很多,所以把品牌和电脑分离。通过桥接的方法把它们再组合起来(在电脑中通过一个品牌的成员变量,创建电脑时,传入具体品牌)
代理模式
访问某个对象时,是通过代理对象间接访问
Spring中的AOP
行为型模式
策略模式
定义一组算法,将每个算法都封装起来, 它们都实现同一个策略抽象类,同过这个策略可以自由切换不同的算法。
例子:比如洗衣机有快洗,大物洗,这就是两个算法,通过定义一个洗衣算法的接口,快洗,大物洗实现这个洗衣算法接口。用户在洗衣的时候,只需要选择一个算法传入洗衣这个方法中即可。
Spring中用到的设计模式
简单工厂模式:BeanFactory
代理模式:AOP
策略模式:自动装配
观察者模式:事件监听机制