经验整理-1-设计模式-100-@

------------------------------必会几种------------------------------

巧记:单例工厂动态地模板策略状态
单例(
订单号)工厂(充值和提现订单)动态(AOP)地模板(文件采集模板)策略(支付方式)状态(支付状态
(手写一个单例模式)
工厂模式分为:简单工厂模式,工厂方法模式和抽象工厂模式(抽象工厂就是把工厂方法模式多个子工厂实现的方法合在一个工厂里)

1)单例模式(创建一个对象,节省内存资源):比如,我们的订单号雪花算法,会大家共用的,这里就会写一个单例模式,大家都调getsingleton方法得到公共类的唯 一对象实例,然后通过它去调生成订单编号的方法。

2)工厂模式-工厂方法模式(代工且解决重复代码):比如充值和提现的下单创建,它们有一些相同的属性,订单号金额等,也有一些不同的信息,比如充值有渠道三方支付公司,提现不分用的接的存管银行等,这个时候就会先创建一个订单表,然后创建子类充值订单表,提现订单表,分别建一个充值工厂类、提现工厂类去创建各个的订单对象,然后再处理对应的业务之后,返回不同的报文给前端。

3)动态代理模式:AOP,没有举例。

4)模板方法模式(文件采集模板):(实际中一般先定义一个模板方法内定义多个基本流程方法:文件源信息获取,文件校验,文件下载,文件解析标准化入库,本地文件删除),模板方法设置成final,子类是不能修改模板方法的,只能继承其他基本方法。这个叫做模板方法模式。
 

两种实现方式:
1)default修饰接口上的模板方法,接口内实现逻辑,子类也可以集成重写,模板机构可以灵活拓展
2)final修饰实现类上的模板方法,实现类上实现逻辑,子类不能再重写,模板机构比较固定
default、final、abstract的用法---区别---
default:可以使用在接口的模板方法1上加上default,它的作用是让这个接口的模板方法1可以直接写实现逻辑,并且不需要强制被子类继承实现(当然也可以实现)。如果没用加上default,继承接口内的方法是必须需要实现重写的
final:使用 final 关键字表示它们不能再被继承或重写
abstract: 通过abstract修饰父类的abstract方法,让自己变成一个接口方法无需实现任何逻辑,且强制让abstract子类必须重写实现这个父类的abstract方法(这个类被abstract修饰后,不会被强制实现上级接口的方法,改由子类强制去实现)

5)状态模式(解决支付状态多重if判断问题):比如充值的状态有进行中/成功/失败,那设计一个状态模式,通过统一入口(Spring上下文容器获取bean时传不同的类beanId来区分不同的状态类),去控制状态的切换,去处理不同状态类的逻辑。以后如果再增加一种别的末知状态,就不用再重复写一些可以共用的代码,减少代码冗余,直接新增一个状态子类,入口传参传新的子类beanId就可以去执行该状态类的逻辑了。

6)策略模式(解决支付方式策略不同):支付策略模式,比如充值支付方式支付宝/威信等方式,下单的时候,我们设计一个策略模式,通过统一入口(Spring上下文容器获取bean时传不同的类beanId来区分不同的支付方式类),去控制支付方式的切换,去处理不同状态类的逻辑。以后如果再增加一种别的支付方式,就不用再重复写一些可以共用的代码,减少代码冗余,直接新增一个支付方式子类,入口传参传新的子类beanId就可以去执行该支付方式类的逻辑,调用对应的支付公司。

状态策略之间的区别:

状态模式---拥有一组定义良好的状态转换,客户对状态对象了解不多,避免在context中放许多条件判断,状态对象则有可能持有自己的数据,是提供给使用者切换状态的(stateless型或者state型),当方法内出现很多if else时可以考虑使用状态模式
策略模式-----由客户指定context要组合的策略对象是哪个,除了继承之外的弹性替代,策略模式封装的只是算法,策略对象一般不会持有自己的数据

7)监听者模式/观察者模式(解耦-发布后就不管了

如Spring自带的应用事件机制就是监听者模式/观察者模式
事件体ApplicationEvent
事件发布者SpringUtils.getApplicationContext().publishEvent(event); 
事件监听者onApplicationEvent(ApplicationEvent event)   这上面加个@Async就变成异步监听了,是并发,可能有并发问题

8)访问者模式(sharding-jdbc 中用的访问者设计模式

------------------------------明细------------------------------

设计模式的根本目的是减少项目变化所造成的影响,这一点要牢牢记住!
工厂模式是把项目当中的变化点抽取封装出来

设计模式就是经过前人无数次的实践总结出的,设计过程中可以反复使用的、可以解决特定问题的设计方法。
面试官:“谈谈Spring中都用到了那些设计模式?”。_为什么 spring 开发都没有人使用抽象类-CSDN博客

巧记23种模式:

1,创建型模式有五种:工厂方法模式 、抽象工厂模式 、单例模式 、建造者模式 、原型模式
口诀:单例工厂的原型建造者也写了一个抽象方法
解释:单例(
单例模式)工厂(工厂方法模式)的原型(原型模式)建造者(建造者模式)也写了一个抽象方法(抽象方法模式)---五种。

2,结构型模式有七中:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
口诀:组合代理适配器的装饰可以让侨胞享受外观
解释:组合(组合模式)代理(
代理模式)适配器(适配器模式)的装饰(装饰模式)可以让侨(桥接模式)胞享(享元模式)受外观(外观模式)---七种

3,行为型模式有十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
口诀:经过访问者和观察者迭代的解释,中介进入状态,想出一个策略模板,用备忘录,记录责任和命令,
解释:经过访问者(访问者模式)和观察者(模板方法模式)迭代(迭代模式)的解释(解释器模式),中介(中介者模式)进入状态(状态模式),想出一个策略(策略模式)模板(模板方法模式),用备忘录(备忘录模式),记录责任(责任链模式)和命令(命令模式),---十一种。

?为什么要使用设计模式?设计模式举例,项目中哪里用到了?

答1:
实现了重用设计,重用前人的设计;
能从直接创建具体产品对象的尴尬局面摆脱出来,使用者只需要传入工厂类的参数,对于如何创建对象(逻辑)不关心。
每个模式一种规则,可以让其他人更容易理解你的想法和做法。

设计模式能降低系统中类与类之间的耦合度。比如工厂模式,使依赖类只需知道被依赖类所实现的接口或继承的抽象类

答1:

单例(饱汉模式、饥汉模式)----重点看安全版的懒()汉式(用到时才创建)

1、构造方法私有化,除了自己类中能创建外其他地方都不能创建(构造和成员变量都得私有化
2、在自己的类中创建一个单实例(饱汉模式是一出来就创建创建单实例,而饥汉模式需要的时候才创建)
3、提供一个方法获取该实例对象(创建时需要进行方法同步)

单例模式是什么:由类自已(私有化构造方法)提供一个方法返回一个单例对象(类变量引用判断不重复)


饿汉模式,利用创建实例中"new对象创建后,首先会加载被static关键字标识的代码(除方法外)",相当于new 对象创建完成后,就创建了static修饰的单例资源。

建议写一个安全版的懒汉式(用到时才创建),这样能体现出多线程安全意识:

public class X {
    private static X x;
    private X() {
    }
    public static X getX() {
        if (x == null) {
            synchronized (X.class) {
                if (x == null) {
                    x = new X();
                }
            }
        }
        return x;
    }
}


Spring框架对单例的支持是采用单例注册表的方式进行实现的

Spring的Singleton实例创建是-双重锁:
它的锁资源还是并发安全map

项目中的应用:数据库连接池/日志对象。因为数据库连接池是一种数据库资源,使用数据库连接池的主要是为了节省打开或者关闭数据库连接所造成的效率损耗,这种效率上的损耗还是非常昂贵的,使用单例设计模式可以大大降低这种损耗。

使用单例模式的好处:

  • 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;
  • 由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。
  • 重复对象少new了,拉圾回收的次数和间隔时间也优化了

项目中使用举例:spring容器默认是单例(并不是严格意义上的单例),好处是为了节约内存,不重复创建对象。

?的作用或优点或应用场景?

假如我先有一个网银充值公共工具类,使用了单例设计模式,每次调用就不会新建对象,节省了内存资源

工厂模式:Spring IOC就是使用了工厂模式.      

?工作原理或实现原理?

工厂模式是什么: 对象的创建交给一个工厂去创建。
分为简单工厂模式.工厂方法模式.
简单工厂模式.:建立一个工厂类,对实现了同一接口的一些类进行实例的创建,按参数区分。


工厂方法模式:创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

?的作用或优点或应用场景?

假如我先有一个网银充值公共工具类,使用了工厂方法模式;后面有需求变更,新增了一个快捷充值工具类,我复用工厂方法思想,只需要新增一个工厂方法和新的快捷充值类就好了。

源码设计到的:

-------------代理模式:Spring AOP就是使用的动态代理。----------

?工作原理或实现原理?

通过中介代理,控制目标对象的访问,可以详细访问目标对象的方法。不直接访问目标对象
1.静态代理模式:静态代理需要自己生成代理类
2.动态代理模式:不需要生成代理类,实现InvocationHandler,有两种,cglib动态代理和JDK动态代理:
2.1JDK动态代理(Java内部的反射机制来实现的---前提,必须是目标类基于统一的接口 )--需要有顶层接口才能使用,但是在只有顶层接口的时候也可以使用,常见是mybatis的mapper文件是代理。使用反射完成。使用了动态生成字节码技术。
2.2JDK动态代理(借助asm字节码控制来实现的---可以直接代理类)--可以直接代理类,使用字节码技术,不能对 final类进行继承。使用了动态生成字节码技术。

动态有两种代理模式:cglib动态代理和JDK动态代理
JDK动态代理有一个致命缺陷是,只能对接口进行代理。如果要代理的类为一个普通类、没有接口,那么Java动态代理就没法使用了。
CGLIB相比于JDK动态代理更加强大,cglib会自动创建一个子类而继承你的父类。从而达到接口实现获取被代理对象信息的目的!

-------------模板方法模式----------

?工作原理或实现原理?

(实际中一般先定义一个接口,抽象类再实现它)定义一个抽象类,写一个模板方法,数个基本方法,模板方法里定义了调用其他方法的顺序,模板方法设置成final,子类是不能模板方法的,这个叫做模板方法模式。
模板方法是通过汇总或排序基本方法而产生的结果集。

 

示例:

(实际中一般先定义一个业务前缀接口,业务前缀抽象类再实现它)定义一个业务前缀抽象类,写一个业务前缀模板方法,数个业务基本方法(业务-系统-模块),业务前缀模板方法里定义了调用其他方法结果的拼接字符串,业务前缀模板方法设置成final,子类是不能修改模板方法的,只能继承其他基本方法。这个叫做模板方法模式,通过业务前缀模板方法统一获得不同的业务系统模块的redis前缀避免重复。

----------突击-start---------

Spring中用到的设计模式

1、单例设计模式
 Spring 中的 Bean 默认都是单例的。
有一些对象其实我们只需要一个,比如说:线程池、日志对象、缓存、对话框、注册表、充当打印机、显卡等设备驱动程序的对象。事实上,这一类对象只能有一个实例,如果制造出多个实例就可能会导致一些问题的产生,比如:程序的行为异常、资源使用过量、或者不一致性的结果。
使用单例模式的好处:
省略创建对象所花费的时间
new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间

几种作用域:

  • singleton 单例
  • prototype : 每次请求都会创建一个新的 bean 实例。
  • request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
  • session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。
  • global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于portlet容器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有不同的会话

 2、工厂设计模式(IOC)
Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象
两者对比:
1)BeanFactory :延迟注入(使用到某个 bean 的时候才会注入)----占用更少的内存,程序启动速度更快
2)ApplicationContext :容器启动一次性创建所有 bean
BeanFactory 仅提供了最基本的依赖注入支持,ApplicationContext 扩展了 BeanFactory ,除了有BeanFactory的功能之外还有额外更多功能,所以一般使用ApplicationContext
3、代理设计模式(AOP)
 Spring AOP 功能的实现。

4、模板方法
 Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。

5、观察者模式
Spring 事件驱动模型就是观察者模式很经典的一个应用。

6、适配器模式
Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

7、装饰者模式

----------突击-end---------

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java_爱吃肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值