JAVA设计模式

写在前面:很多老程序员、前辈都说,要往高深的方向走,算法和设计模式都是必须掌握的。说来惭愧,开发一年多,对于设计模式只知道简单的懒汉式饿汉式,外面疫情肆虐,刚好补充一下自己的短板,让自己不再拘于增删改查,在开发道路上走的更远!

设计模式的七大原则

设计模式原则,就是 设计模式为什么要这样设计的依据。也是程序员在变粗时应当准守的原则。

  1. 单一职责原则

对类来说的,即一个类应该只负责一项职责。如类A负责两个不同的职责:职责1(操作表 a)、职责2(操作表b)。当职责1需求变更而改变类A时,可能造成职责2的执行错误,所以需要将类A分解为A1\A2.

目的:

  • 降低类的负责度,保证一个类只负责一项职责;
  • 提高类的可读性,可维护性;
  • 降低变更引起的风险;
  • 通常情况下,我么应当准守单一职责原则,只有逻辑足够简单或类中方法数量足够少,才可以在方法级别保持单一职责原则。
  1. 接口隔离原则

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上。

例如,类A和类B都实现一个接口X,接口中有5个抽象方法,那么A、B都要实现这五个方法,如果如果类C依赖于类A,类D依赖于类B,但是类C只需要其中的1,3,5方法,那么A方法中的2,4方法就是多余的,应该剔除;而类D只需要B中的1,2,4方法,那么3,5方法就是多余的。
如何解决呢?我们可以将接口X拆分为X、Y、Z 3个接口,X接口中只有1方法,Y接口中只有3,5方法,Z接口中有2,4方法。这时候类A实现X、Y接口,B实现X、Z接口,这样就遵循了接口隔离原则。

  1. 依赖倒转(倒置)原则

依赖倒转原则的中心思想是面向接口编程。要求低层模块(类)都要有抽象类或接口,或者两者都有,这样程序的稳定性更好。避免出现一个类直接继承object类的情况,维护性,扩展性太差!

设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础要稳定的多。(在java中,抽象指的是接口或抽象类,细节就是具体的实现类)

  1. 里氏替换原则

里氏替换原则要求:所有引用基类的方法必须能透明的使用其子类对象,或者说子类中尽量不要重写父类的方法,可以通过聚合、组合、依赖 来解决问题。

例如:类B继承类A并重写了类A的method方法,那么调用类B的method方法就是用的是类B的方法,而不是类A自己的方法了。那么这里可以再建立一个基类O,让类A、类B都继承类O,那么类A、类B都可以写自己的method,从而互不干扰。

  1. 开闭原则

开闭原则是编程中最重要最基础的设计原则,它要求软件需要更新变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化,即通过增加代码,而不是修改代码。即:对扩展开放,对修改关闭。

  1. 迪米特法则

迪米特法则,又叫最少知道原则,即一个类对自己依赖的类知道的越少越好(只要拿到自己需要的东西即可,不用知道这个东西是怎么来的)。他的要求就是,只与直接朋友通信(直接朋友包括:成员变量、方法参数、方法返回值;不是直接朋友【又叫陌生类】:局部变量)。

如何实现迪米特法则:尽量保证与当前类有关的方法都写在当前类中;尽量保证当前类不出现针对别的类的方法。保证方法的可重用性,降低类之间的耦合。

  1. 合成复用原则

当类A需要使用类B中的方法时,尽量使用合成/聚合的方式,而不是使用继承(注:UML类图中,虚线箭头表示依赖;空心菱形表示聚合;实心菱形表示组合)

设计模式类型

设计模式分未三种类型,23种模式。

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

2、结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。

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

一、单例设计模式

  1. 饿汉式(不管该类是否被使用,一加载就创建类对象)
    在这里插入图片描述

存在缺点:在该类加载的时候就创建实例,但是该类不一定会使用到,所以可能会存在资源浪费问题

  1. 懒汉式(当该类被调用的时候再去创建实例)
    方式一、存在线程安全问题的
    在这里插入图片描述

该模式可以实现在第一次被调用时去新建一个对象实例,但是会存在线程安全问题,比如第一个线程进来判断stu==null为true,在创建实例之前第二个线程也进来判断,也为true,此时就会创建两个实例对象,所有线程不安全,实际开发中不可取。

方式二、通过同步方法使线程安全
在这里插入图片描述

该方式可以确保创建实例的方法只能被一个线程所调用,可以解决线程安全问题,但是,该方法效率太低,也不可取。

方式三、双重检测
在这里插入图片描述

双重检测,解决线程安全问题,同时解决性能问题,推荐使用

  1. 使用静态内部类的形式
    在这里插入图片描述

外部类的加载不会导致静态内部类的加载,保证懒加载,节省资源;类的静态属性只会在第一次加载的时候初始化,所以在这里不会有线程安全问题!推荐使用

  1. 使用枚举来实现
    在这里插入图片描述

使用枚举可以实现单例模式,且不仅能避免多线程同步的问题,而且还能方式反序列化(反射)重新创建对象。推荐使用!

单例模式总结:

单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能;
单例模式使用场景包括:频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(重量级对象)但又经常用到的对象,工具类对象,频繁访问数据库或文件的对象(如数据源、session工厂);
jdk中使用到的单例模式:例如Runtime类,使用了饿汉式模式。

二、工厂设计模式

  1. 简单工厂
    在这里插入图片描述

简单工厂违背了开闭原则,因为如果新增一个品牌,就要修改工厂类里面的creatCar方法,不方便扩展。

  1. 生产方法
    在这里插入图片描述

为每一个产品创建一个工厂,如果有新增的品牌,那么为这个新品牌创建一个工厂,不用修改之前的代码,提高了扩展性。

  1. 抽象工厂

在这里插入图片描述

抽象工厂其实就是简单工厂+工厂方法。

工厂模式总结:工厂模式就是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖解耦。从而提高项目的扩展和维护性。
有的书上说,变量不要直接持有具体类的引用。即创建对象实例时,不要直接new该类,而是把这个new类的动作放在一个工厂的方法中,并返回。

三、原型模式

在这里插入图片描述

原型模式总结:原型模式主要在创建新的对象比较复杂时,可以简化对象的创建流程,同时也能提高效率,并且如果原始对象发生变化时(属性增加或减少)其他克隆对象都不需要修改代码。
缺点:需要为每一个类配备一个克隆方法,如果已经存在一些类,则要进行代码修改,违反了ocp原则。

    了解浅拷贝和深拷贝前往:浅考评和深拷贝分析

四、建造者模式(生成器模式)

博客未完待续…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值