设计模式
2023-05-28 17:00:38 0 举报
AI智能生成
spring 设计模式
作者其他创作
大纲/内容
23种设计模式
创建型设计模式
含义:适用于创建对象的同时隐藏创建对象的过程,不需要通过new的形式创建一个实例对象
工厂模式
简单工厂模式
含义:编码习惯
缺点:通过if else判断,如果新增,不符合开闭原则
工厂模式
含义:
优点:1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事
使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口
抽象工厂模式
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
单例模式
- 只有一个实例
- 构造私有化,禁止外部访问
- 提供一个静态方法
饿汉模式
含义:每次对象的创建就会创建一个实例化对象
public class SingletonTest {
private static final SingletonTest instance = new SingletonTest();
private SingletonTest() {}
public SingletonTest getInstance() {
return instance;
}
}
private static final SingletonTest instance = new SingletonTest();
private SingletonTest() {}
public SingletonTest getInstance() {
return instance;
}
}
优点:简单
缺点:线程不安全
懒汉模式
双重检查锁
含义:两次if判断,防止线程安全问题,只有在调用的时候创建对象,也叫延迟调用
public class SingletonTwo {
private static volatile SingletonTwo instance=null;
private SingletonTwo() {}
public static SingletonTwo getInstance() {
if(instance==null){
//加锁,解决并发安全问题
synchronized (SingletonTwo.class){
if(instance==null){//没有理解为啥还要加一层判断,是担心并发的时候还是有实例为空的进来么?
return new SingletonTwo();
}
}
}
return instance;
}
}
private static volatile SingletonTwo instance=null;
private SingletonTwo() {}
public static SingletonTwo getInstance() {
if(instance==null){
//加锁,解决并发安全问题
synchronized (SingletonTwo.class){
if(instance==null){//没有理解为啥还要加一层判断,是担心并发的时候还是有实例为空的进来么?
return new SingletonTwo();
}
}
}
return instance;
}
}
优点:1-延迟加载,节省性能,减少不必要的内存消耗
2-解决线程安全问题
2-解决线程安全问题
缺点:无法克服反序列和发射破坏单例
静态内部类
含义:懒汉模式和静态内部类单例都不错,但是它们并不能防止反序列化和反射生成多个实例。更好的写法当然是枚举单例了,
public class SingletonThree {
private SingletonThree() {}
private static class SingleInstance{
private final static SingletonThree INSTATNCE= new SingletonThree();
}
public SingletonThree getInstance(){
return SingleInstance.INSTATNCE;
}
}
private SingletonThree() {}
private static class SingleInstance{
private final static SingletonThree INSTATNCE= new SingletonThree();
}
public SingletonThree getInstance(){
return SingleInstance.INSTATNCE;
}
}
优点:解决线程安全问题
缺点:不能克服发射和反序列
枚举类
含义:枚举是java的一种特殊类,它的构造器只能是私有的,即使是不写修饰符(默认)也是私有的
package com.atguigu.ct.producer.controller;
public enum EnumSingleton {
//定义一个单例对象
INSTANCE;
//获取单例对象的方法
public static EnumSingleton getInstance(){
return INSTANCE;
}
}
public enum EnumSingleton {
//定义一个单例对象
INSTANCE;
//获取单例对象的方法
public static EnumSingleton getInstance(){
return INSTANCE;
}
}
优点:
- 不用考虑懒加载和线程安全的问题,代码写法简洁优雅
- 线程安全
- 克服反射和反序列
原型模式
特征:通过object类的clone方法实现对象的克隆,克隆出来的对象地址和原型对象地址,能够通过减少不断对象实例化减少内存资源的消耗,同时对象的创建对外隐藏
场景:创建对象消耗比较大,新的对象可以通过原型模式对已有对象进行复制
优点:可以简化对象创建过程,通过复制一个实例,提高创建一个实例的效率
缺点:深克隆实现比较复杂
行为型设计模式
含义:关注对象之间的通信,通过对象之间的通信实现不同的功能
观察者模式
特征:一个对象发生改变,会通知对应的相关对象,能实现发布和订阅服务
场景:一个对象发生改变,一个对象或多个对象也发生改变,而这些对象互不熟悉
优点:一个对象发生改变:能够实现不同对象通信的发布-订阅模式,一个对象发布信息,其他对象对发布信息,进行订阅响应
缺点:被改变的对象的改变过程对引起改变的对象不透明
策略模式
特征:不同的场景可以有不同的执行方式
场景:不同的需求有不同的执行方案
优点:可以不同的业务场景,有不同策略和方案
缺点:客户端需要知道所有的策略,每个策略通过一个子类进行扩展,比较麻烦
模板模式
特征:对外提高一套固定的执行体系,流程和算法模板,通过这个模板可以解决相同业务逻辑的不同实现
场景:在相同的业务逻辑处理的流程中,可以抽取相同的业务形式固定的模板
优点:避免调用相同的算法,处理相同业务逻辑的冗余
缺点:每一个不同的实现都需要增加一个子类,扩展较为麻烦
命令模式
委派模式
特征:通过对任务进行分发,委派给不同的执行角色,然后将执行结构返回给委派者,实现任务的分发调度
场景:springMVC 中的dispatcherservlet的执行流程
优点:通过任务分派可以将一个大型的任务进行细化,通过统一的任务管理,实现对这些子任务完成情况,实现任务的跟进
缺点:需要跟进任务的复杂程度进行不同的改变,任务复杂的情况下,可能会有多重委派,造成混乱
状态模式
中介者模式
迭代器模式
访问者模式
备忘录模式
解释器模式
结构型设计模式
注重类和对象的组合,通过接口的组合以及定义组合的对象得到新的功能
适配器模式
装饰者模式
特征:在不改变原有的状态的条件下,对原有对象进行扩充,是她具有不同的属性
使用场景:动态增加功能,动态删除
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承一个替代模式,装饰模式可以动态扩展一个实现类功能
缺点:多层装饰比较复杂
享元模式
代理模式
特征:通过代理角色完成被代理角色的一些操作,职责清晰,高扩展
优点:职责清晰,高扩展
缺点:增加代理对象,影响性能
场景:Nginx服务器
外观模式
组合模式
桥接模式
七大设计原则
开闭原则
含义:对类 、模块、函数对外开发,对修改关闭
优点:提高软件的复用性及可维护性
场景:双十一,对价格进行修改,不要改变原价格,需要原价和打折后的价格
里式替换原则
含义:子类继承父类,除新增方法和新增功能外,尽量不要重写父类方法,父类可以定义共有的抽象方法,子类在继承父类方法的时候,入参要比父类更宽松
场景:定义一个抽象类关于扣钱和存钱的,然后储蓄卡和信用卡分别实现,并且带有自己特色的方法
优点:开闭原则
依赖倒置原则
含义:面向接口编程
场景:很像依赖注入,不用自己写,通过注入方式导入
优点:可以减少类的耦合性,提高系统稳定性,提高代码可读性和可维护性
迪米特原则
含义:最少知道原则
场景:老师关心学生成绩进行计算,校长关心老师统计出来的分数,而不是校长去关心学生的成绩进行计算
单一职责原则
含义:一个类只有一个职责
场景:一个类中包含普通用户和VIP用户,尤其是有这种判断分支的时候,应该定义一个顶层的接口,然后分角色不同的实现,如果有新增的话,直接新增一个实现而不是改变原有的类
接口分离
含义:将一个接口的多个功能拆分成多个接口,实现接口隔离
组合复用原则
忽略
0 条评论
下一页