原则
- 单一职责原则
- 里氏替换原则(继承)
- 依赖倒置原则(具体依赖–>抽象依赖)
- 接口隔离原则(接口尽量小,高内聚)
- 迪米特法则(低耦合,只和朋友类交流,不和陌生类交流;高内聚:尽量暴露少的方法)
- 开闭原则(同过扩展拥抱变化,而不是修改原有系统)
模式
单例模式(简单)
- 定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
两个问题:1. 如何产生对象? 2. 如何仅产生一个对象?3. 如何自行实例化?
- 如何产生对象?我们可以通过new关键字,可以产生多个不同对象。(当然,创建对象的方式有很多,比如:反射、clone、序列化)
- 如何仅产生一个对象?收取你自己new的资格(禁止外部创建对象)。(你要明白,new是通过构造器来创建对象的,所以说,要收取你new的资格,就是将构造器私有化)。
- 如何自行实例化?自己内部new一个对象,供外界使用。
public class Singleton {
private static final Singleton singleton =new Singleton();//自行实例化
private Singleton(){ //私有化构造器,禁止外部创建对象
}
public static Singleton getInstance(){ //供外界使用
return singleton;
}
//可以自定义一些其他的public static方法
}
懒汉式与饿汉式
- 饿汉式
public class Singleton {
private static final Singleton singleton =new Singleton();//自行实例化
private Singleton(){ //私有化构造器,禁止外部创建对象
}
public static Singleton getInstance(){ //供外界使用
return singleton;
}
//可以自定义一些其他的public static方法
}
- 懒汉式
public class Singleton {
private static Singleton singleton = null;
private Singleton(){ //私有化构造器,禁止外部创建对象
}
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){ //加锁,保证线程安全
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;//自行实例化;
}
//可以自定义一些其他的public static方法
}
最佳实践
Spring中每个Bean都是单例的,Spring容器管理这些bean的生命周期。如果采用非单例模式(Prototype)bean初始化后的管理交由J2EE容器,Spring不在跟踪管理Bean。
JVM垃圾回收机制,如何让对象常驻在内存中?J2EE容器和框架级容器(Spring)可以让对象常驻在内存。
工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
抽象工厂模式
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式使工厂方法模式的升级版。
模板方法模式(简单)
定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类不改变一个算法的结构即可重新定义该算法的某些特定步骤。
装饰器模式
在不改变原有类的基础上,进行功能扩展。如下所示:
Cache接口的实现有多个,但是大部分都是装饰器,只有PerpetualCache提供了Cache接口的基本实现,其他的装饰器都是在PerpetualCache的基础上提供了一些额外的功能,通过各种组合后满足一个特定的需求