感谢牛客网网友提供的面试经验!
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. 单例模式懒汉式和饿汉式区别?
- 饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,懒汉式本身是非线程安全的,为了实现线程安全可以加synchronized锁。
- 资源加载和性能:饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。
原文链接: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;
}
}
- 静态内部类【推荐】
public class Singleton {
private static class SingletonHolder{
private static final Singleton INSTTANCE = new Singleton();
}
private Singleton(){};
public static final Singleton getInstance(){
return SingletonHolder.INSTTANCE;
}
}
- 双重校验锁【推荐】
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的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。