JAVA设计模式
设计模式分类
JAVA设计模式可根据创建型模式、结构型模式、行为型模式分为三大类:
创建型模式
单例模式、工厂模式、抽象工厂模式、
建造者模式、原型模式结构型模式
适配器模式、桥接模式、装饰模式、
组合模式、外观模式、享元模式、代理模式行为型模式
模版方式模式、命令模式、迭代器模式、观察者模式、
中介者模式、备忘录模式、解释器模式、状态模式、
策略模式、责任链模式、访问者模式
单例模式
单例模式其核心作用就是保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。常见的单例模式应用场景如下:
- windows的任务管理器、回收站和操作系统的文件系统
- 项目中读取配置文件的类
- 网站的计数器和应用程序的日志(这一般是由于共享的日志文件一直处于打开状态,只能由一个实例去操作,否者不好追加)
- 数据库连接池的设计
- Servlet编程中的Application对象
- Servlet编程中的每个Servlet对象
- Spring中每个bean默认就是单例,这样做的优点就是spring容器可以管理
由于单例模式只生成一个实例,减小了系统性能的开销,当一个对象的产生需要比较多的资源,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
常见的5种单例模式实现方式:
- 饿汉式(线程安全,调用效率高,但是,不能延时加载)
- 懒汉式(线程安全,调用效率不高,但是,可以延时加载)
- 双重检测锁式(由于JVM底层内部模型原因,偶尔会出现问题,不建议使用)
- 静态内部类模式(线程安全,调用效率高,但是,可以延时加载)
- 枚举单例(线程安全,调用效率高,但是,不能延时加载)
饿汉式
package singleton;
/**
*
* @project:pattern
* @ClassName:SingletonDemo1
* @Description:此类为...
* @author :cage
* @date:21 Apr 2015 01:07:00
* @modifier:cage
* @modifier time:21 Apr 2015 01:07:00
* @comments: 单例饿汉式
* @version
*
*/
public class SingletonDemo1 {
//类初始化时,立即加载这个对象(没有延时加载的优势),加载类时,天然的是线程安全的
private static SingletonDemo1 instance=new SingletonDemo1();
private SingletonDemo1(){
}
//不需要线程同步,调用效率高
public static SingletonDemo1 getInstance(){
return instance;
}
}
懒汉式
package singleton;
/**
*
* @project:pattern
* @ClassName:SingletonDemo2
* @Description:此类为...
* @author :cage
* @date:21 Apr 2015 01:06:14
* @modifier:cage
* @modifier time:21 Apr 2015 01:06:14
* @comments: 单例懒汉式
* @version
*
*/
public class SingletonDemo2 {
//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
private static SingletonDemo2 instance;
private SingletonDemo2(){}
//方法同步,调用效率低
public static synchronized SingletonDemo2 getInstance(){
if(instance==null){
instance=new SingletonDemo2();
}
return instance;
}
}
静态内部类(也是一种懒加载方式)
package singleton;
/**
*
* @project:pattern
* @ClassName:SingletonDemo3
* @Description:此类为...
* @author :cage
* @date:21 Apr 2015 23:49:44
* @modifier:cage
* @modifier time:21 Apr 2015 23:49:44
* @comments:静态内部类实现单例模式,线程安全,调用效率高,并且实现了延时加载
* @version
*
*/
public class SingletonDemo3 {
private static class SingletonClassInstance{
private static final SingletonDemo3 instance=new SingletonDemo3();
}
private SingletonDemo3(){}
private static SingletonDemo3 getInstance(){
return SingletonClassInstance.instance;
}
}
外部类没有static属性,则不会像饿汉式那样 立即加载对象。
只有真正调用getInstance(),才会加载静态内部类,加载类时是线程安全的,instance是static final类型的,保证了内存中只有这样一个案例存在,而且只能被赋值一次,从而保证了线程安全性和兼并了并发高效调用和延时加载的优势。
枚举方式
package singleton;
/**
*
* @project:pattern
* @ClassName:SingletonDemo4
* @Description:此类为...
* @author :cage
* @date:22 Apr 2015 00:08:32
* @modifier:cage
* @modifier time:22 Apr 2015 00:08:32
* @comments:枚举类型实现单例,没有懒加载
* @version
*
*/
public enum SingletonDemo4 {
//这个枚举元素,本身就是单例对象
INSTANCE;
public void singletonOperation(){
}
}