序
设计模式是一种思想,一个让自己写的代码更有质量更加的优美,但在实际开发中并没有正在的去使用他们,大多都是一股脑的快速实现一个业务需求,并没有考虑代码的扩展性、健壮性、开闭原则、单一原则等等。那样的代码就像一坨一坨的,写完再也不想再见到它。为了使自己代码质量得到提升,设计模式有必要深入探索。
设计模式三大类
- 创建型模式
- 结构型模式
- 行为型模式
创建型模式分类
创建型具体的实现可分为5中模式
- 工厂模式
- 抽象工厂模式
- 创造者模式
- 原型模式
- 单例模式
模式的理解概述
根据博主自己学习理解的加以概述,或许看一次并不能真正运用在实际开发中,但如果知道每一种模式适用的场景和大致的实现结构,倘若有类似的业务场景岂不是一个好的方向,并更加以深入某一模式研究学习,或许那就是自己转变的一个关键点。
- 工厂模式:该模式相对是比较常用,适用的业务场景也比较的多
适用场景:现在许多系统都有积分机制,通过完成不同的任务获得不等的积分,那么用户累计获得的积分可可以用户获取不同的奖品(兑换实体商品、兑换优惠券、兑换腾讯视频月卡…),虽然都是兑换操作,但所操作的兑换东西类型完全不同。所以我们只需要定义统一的入参,创建一个兑换工厂类,不同类型的兑换物分别实现工厂类,最后通过传入的类型来区分使用那一种兑换实现类即可。
扩展性:如果后期有新增的兑换类型,则可在实现兑换工厂类接口即可,不会改动已有的逻辑。
缺点:可能随着类型的增加,会创建很多的实现类,可根据实际得业务场景进行跳转或结合其他模式混合使用
- 抽象工厂模式
适用场景:系统中已经存在的功能,现在需要进行升级优化,但系统中许多的业务线都在使用同一个功能,不能对原有的接口进行修改(替换redis双集群升级)。那么我们就把该功能的接口单独在抽象出来,新的方案再去实现这个抽象接口,多个方案则创建多个实现类。具体通过jdk的动态代理机制和Java的反射机制进行接口的代理。调用之前的接口但通过代理类传入不同的实现类对象class,从而代理到具体的实现方案上。
抽象工厂其实是一个中心工厂, 创建其他工厂模式
- 创造者模式
适用场景:快餐店的套餐选配场景、或者各项装修物料组合套餐选配场景。提前创建和各个单项的实体属性对象,再实现一个各个单项包加购方法逻辑类,再来一个加购填充单项的方法构建类,多个不同的套餐则在构建类中创建多个单项填充方法,要获取哪一个套餐则只需调用需要的构建方法即可。如果有新增的套餐,则只需要在构建类中新增方法并填充,不会影响其他套餐逻辑。
大大提升扩展性、单一原则的体现
- 原型模式
适用场景:上机考试多套试,每人题目和答案乱序排列场景。博主现实遇到过的场景就是驾校科一科四上机考试,每个考生试题的顺序都是随机从题库中抽取(这个场景只是抽取了一部分考题,并不是题库额全部考题),确保考试的公平性。具体的实现是通过java中的clone机制进行。每个考生复制一套原始题库数据,再对复制的题库进行顺序随机重排并生成试卷。
注1:具体的逻辑博主在学习这个模式时,疑惑的点是用直白的代码实现和通过原型模式实现区别不是很大,直白实现加个随机试题工具方法不使用clone机制感觉问题也不大,或许是自己还没理解透彻。
注2:该模式实际业务场景很少见,可适当了解,真有该业务场景再来深入研究即可
- 单例模式
使用场景:1.项目中定义的全局变量 2.数据库的连接池 3.spring中的单例模式bean的使用与生成
分类:
- 懒汉模式(线程不安全)
- 懒汉模式-加锁(线程安全)
- 饿汉模式(线程安全、但浪费资源)
- 静态内部类 (线程安全、加锁不消化性能)(因为JVM虚拟机可以保证多线程并发访问的正确性,也就是一个类的构造方法在多线程环境下可以被正确的加载)(推荐使用)
- 双重锁模式 (线程安全、懒汉双重锁-相对减少了资源的浪费)
- CAS (线程安全)
- 枚举单列模式(线程安全、代码实现少)
后语
设计模式之创建型模式算是告一段落了,理解后再去实践把它用到熟能生巧才是真正的掌握。
下一站:设计模式之结构型模式