Java后台开发面试实战(四):设计模式

感谢牛客网网友提供的面试经验!

1. 设计模式的六大原则?
  • 单一职责原则(Single responsibility principle,SRP)单一职责规定了一个类应该只有一个发生变化的原因。如果一个类承担了多个职责,则会导致多个职责耦合在一起。但部分职责发生变化的时候,可能会导致其余职责跟着受到影响,也就是说我们的程序耦合性太强,不利于变化。
  • 里氏替换原则(Liskov Substitution Principle,LSP):里氏替换是指所有父类可以出现的地方,子类就都可以出现,使用子类来替换父类,调用方不需要关心目前传递的父类还是子类。
  • 依赖倒置原则(Dependence Inversion Principle,DIP)依赖倒置原则是指高层模块不应该依赖于底层模块,抽象不应该依赖细节,细节应该依赖抽象。在Java中,接口和抽象类都是抽象,而其实现类就是细节。也就是说,我们应该做到面向接口编程,而非面向实现编程。
  • 接口隔离原则(Interface Segregation Principle, ISP):接口隔离原则是指客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。
  • 迪米特法则(Law of Demeter,LoD):迪米特法则也叫最少知识原则,是指一个对象应该对其依赖的对象有最少的了解。该类不需要知道其依赖类的具体实现,只需要依赖类给其提供一个公开对外的public方法即可,其余一概不需要了解。
    迪米特法则的核心就是解耦合,减弱类间的各个耦合,提高类的复用率。
  • 开闭原则(Open Close Principle,OCP):开闭原则是指一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。也就是说,通过开闭原则,我们可以通过扩展行为来实现新的功能,而不是通过修改已有的代码。开闭原则可以帮助我们构建一个稳定,灵活的软件系统。
2. 常见的设计模式有哪些?
  • 工厂方法模式:工厂方法模式是一种常见的设计模式。工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到其子类。
  • 模板方法模式:模板方法模式也是一个常见的模式。模板方法模式定义了一个框架,将一些步骤延迟到其子类中实现,子类可以在不改变框架的前提下重新定义某些特定的执行步骤。
3. 单例模式懒汉式和饿汉式区别?
  1. 饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,懒汉式本身是非线程安全的,为了实现线程安全可以加synchronized锁。
  2. 资源加载和性能:饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。

原文链接:https://blog.csdn.net/qq_35098526/article/details/79893628

4. 请手写一下单例模式?

创建单例类的步骤:
1、私有化该类的构造函数。
2、通过new在本类中创建一个本类对象。
3、提供一个公有的静态方法,将创建的对象返回。
单例类因为不允许其他程序用new来创建该类对象,所以只能将单例类中的方法定义成静态的(随类的加载而加载),静态方法不能访问非静态的成员,故只能> > 将该类中new的本类对象变成静态的。

1. 懒汉式:用到时再去创建

public class Singleton {
    private static  Singleton instance;
    private Singleton(){};
   //同步代码块用的锁是单例的字节码文件对象,且只能用这个锁
    public static synchronized Singleton getInstance(){
     /*如果第一个线程获取到了单例的实例对象,
	   后面的线程再获取实例的时候不需要进入同步代码块中了*/
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

2. 饿汉式:初始化时即创建,用到时直接返回

public class Singleton {
   //1.私有化构造器
   private Singleton(){};
   //2.在类中创建一个类的实例,私有化,静态的
   private static  Singleton instance = new Singleton();
  // 3.通过公共方法调用,此公共方法只能类调用,因为设置了 static
   public static Singleton getInstance(){
       return instance;
   }
}
  1. 静态内部类【推荐】
public class Singleton {
   private static class SingletonHolder{
       private static final Singleton INSTTANCE = new Singleton();
   }

   private Singleton(){};

   public static final Singleton getInstance(){
       return SingletonHolder.INSTTANCE;
   }
}
  1. 双重校验锁【推荐】
public class Singleton {
    private volatile static Singleton singleton; 
    private Singleton(){};
    
    public static Singleton getSingleton(){
        if(singleton == null){
            synchronized(Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    } 
}
5. SVN知道吗?

SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值