创建型模式是对类的实例化过程的抽象化,能够提供对象的创建和管理职责。创建型模式共有5中:
- 单例模式
- 工厂模式
- 抽象工厂模式
- 建造者模式
- 原型模式
单例模式定义:
确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
单例模式的主要作用:
确保一个类只有一个实例存在。单例模式可以用建立目录、数据库连接等需要单线程操作的场合、用于实现对系统资源的控制
使用场景
- 要求生成唯一序列号的环境
- 在整个项目中需要一个共享访问点获共享数据,例如,一个Web页面上的技术器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的。
- 创建一个对象需要消化的资源过多,如访问IO和数据库等资源
- 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(也可以采用直接声明static的方式)
Spring框架中,每个Bean默认就是单例的;Java基础类库中的java,lang,Runntime类也采用了单例模式,其getRunntime()方法返回了唯一的实例
注意事项:
单例类可以分为有状态单例类和无状态单例类,尽量避免使用有状态的单例类
单例类不需要实现Serializable和Cloneable接口
单例模式实例:
/**
* 记录访问次数
* @author user
*
*/
public class GlobalNum {
private static GlobalNum gn = new GlobalNum();
private int num = 0;
public static GlobalNum getInstance() {
return gn;
}
public synchronized int getNum() {
return ++num;
}
}
public class SingleDemo {
public static void main(String[] args) {
NumThread threadA = new NumThread("线程A");
NumThread threadB = new NumThread("线程B");
threadA.start();
threadB.start();
}
}
class NumThread extends Thread{
private String threadName;
public NumThread(String threadName) {
this.threadName = threadName;
}
@Override
public void run() {
GlobalNum gnObj = GlobalNum.getInstance();
for (int i = 0; i < 5; i++) {
System.out.println(threadName + "第" + gnObj.getNum() + "次访问!");
try {
this.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}