本文为学习记录
####单例模式:
定义:所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法)。
举例:比如 Hibernate 的 SessionFactory,它充当数据存储源的代理,并负责创建 Session 对象。SessionFactory 并不是轻量级的,一般情况下,一个项目通常只需要一个 SessionFactory 就够,这是就会使用到单例模式,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
应用:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session 工厂等)。
单例模式思考:
- 为什么需要单例模式?
为了解决资源访问冲突。全局唯一类。 - 单例模式模式有哪些缺点
对oop的特性支持不友好,不支持有参数的构造函数。 - 如何设计一个集群模式下单例模式?
可以采用对象序列化到磁盘中,每次获取对象都从磁盘中优先加载。
代码:
public class XmlPaseTest {
//饿汉式-静态常量
// private static final XmlPaseTest xmlPaseTest=new XmlPaseTest();
//
// private XmlPaseTest(){
//
// }
// public static XmlPaseTest getInstance(){
// return xmlPaseTest;
// }
//饿汉式-静态代码块
// private static XmlPaseTest xmlPaseTest;
//
// private XmlPaseTest(){
//
// }
// static {
// xmlPaseTest=new XmlPaseTest();
// }
// public static XmlPaseTest getInstance(){
// return xmlPaseTest;
// }
//懒汉式,线程不安全
// private XmlPaseTest(){
//
// }
// private static XmlPaseTest xmlPaseTest=null;
//
// public static XmlPaseTest getInstance(){
// if (xmlPaseTest==null){
// xmlPaseTest = new XmlPaseTest();
// }
//
// return xmlPaseTest;
// }
//懒汉式,同步方法
// private XmlPaseTest(){
//
// }
// private static XmlPaseTest xmlPaseTest=null;
//
// public static synchronized XmlPaseTest getInstance(){
// if (xmlPaseTest==null){
// xmlPaseTest = new XmlPaseTest();
// }
//
// return xmlPaseTest;
// }
//懒汉式,双端锁
// private static volatile XmlPaseTest xmlPaseTest;
//
// private XmlPaseTest(){
//
// }
//
// public static XmlPaseTest getInstance(){
// if (xmlPaseTest==null){
// synchronized (xmlPaseTest.getClass()){
// if (xmlPaseTest==null) {
// xmlPaseTest = new XmlPaseTest();
// }
// }
// }
// return xmlPaseTest;
// }
// //懒汉式 静态内部类
// private XmlPaseTest(){
//
// }
// private static class PaseTest{
// private static final XmlPaseTest xmlPaseTest =new XmlPaseTest();
// }
// public static XmlPaseTest getInstance(){
// return PaseTest.xmlPaseTest;
// }
// 枚举模式
enum PaseTest{
PASTEST;
private PaseTest(){
}
public PaseTest getInstance(){
return PASTEST;
}
}
public static void main(String[] args) {
}
}