设计模式六大原则
单一职责原则
一个类或一个接口只承担一个职责。
迪米特法则
尽量减少对象之间的交互,从而减少类之间的耦合。
接口隔离原则
不要对外暴露没有实际意义的接口。
里氏替换原则 (尽量不要继承 可 以使用组合)
只重写父类的抽象方法 不重写父类的非抽象方法。
只要父类能出现的地方,子类就可以出现,而且替换为子类也不会产生任何错误或异常。
有子类出现的地方,父类未必就可以代替。
覆盖或实现父类的方法时,输入参数可以被放大。
覆盖或实现父类的方法时,输出结果可以被缩小。
依赖倒置原则
高层模块不应该依赖于低层模块,而应该依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。
开闭原则
对软件实体的改动,最好用扩展而非修改的方式。
工厂模式
什么是工厂模式
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向
新创建的对象。实现了创建者和调用者分离,工厂模式分为简单工厂、工厂方法、抽象工厂模式
工厂模式的好处
利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。将选择实现类创建对象统一管理和控制从而将调用者跟实现类解耦。
Spring开发中的工厂设计模式
-
SpringIOC
看过Spring源码就知道,在Spring IOC容器创建bean的过程是使用了简单工厂设计模式Spring中无论是通过xml配置还是通过配置类还是注解进行创建bean,大部分都是通过简单工厂来进行创建的。当容器拿到了beanName和class类型后,动态的通过反射创建具体的某个对象,最后将创建的对象放到HashMap中(保证对象只被创建一次)。
-
为什么Spring IOC要使用工厂设计模式创建Bean呢
Spring使用工厂模式编程写一个工厂 由工厂创建Bean,以后我们如果要对象就直接管工厂要就可以剩下的事情不归我们管了。Spring IOC容器的工厂中有个静态的Map集合,是为了让工厂符合单例设计模式,即每个对象只生产一次,生产出对象后就存入到Map集合中保证了实例不会重复影响程序效率。
工厂模式分类
简单工厂:用来生产同一等级结构中的任意产品。
工厂方法:用来生产同一等级结构中的固定产品
抽象工厂 :用来生产不同产品族的全部产品。(不支持拓展增加产品;支持增加产品族)
单例设计模式(面试重点) 管理数据源连接
概念:单例对象的类必须保证只有一个实例存在
生命周期:随项目启动而创建随项目停止而销毁
适用场景:单例模式只允许创建一个对象,因此节省内存加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。如:
-
需要频繁实例化然后销毁的对象。
-
创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
-
有状态的工具类对象。
-
频繁访问数据库或文件的对象。
1.饿汉式
public class Singleton {
/**
* 优点:没有线程安全问题,简单
* 缺点:提前初始化会延长类加载器加载类的时间;如果不使用会浪费内存空间; 不能传递参数
*/
private static final Singleton instance = new Singleton();
private Singleton(){
};
public static Singleton getInstance(){
return instance;
}
}
2.懒汉式
public class Singleton{
/*** 优点:解决线程安全,延迟初始化( Effective Java推荐写法)
*/
private Singleton(){
}
public static Singleton getInstance () {
return Holder.SINGLE_TON;
}
private static class Holder{
private static final Singleton SINGLE_TON = new Singleton();
}
}
- 静态变量和静态代码块是在类加载时被执行
- 成员变量随着对象创建而被创建 随着对象的回收而被释放
- 静态方法随着方法的调用而加载
3.双重检查锁(double checked locking)
public class Singleton {
private volatile static Singleton uniqueSingleton;
private Singleton() {
}
public Singleton getInstance() {
if (null == uniqueSingleton) {
synchronized