单例设计模式

简介: 饿汉式单例 对于饿汉模式,我们可这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。 懒汉式单例类 对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。
饿汉式单例
对于饿汉模式,我们可这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。

懒汉式单例类
对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。

单例设计模式常用于JDBC链接数据库

注意:
1 我们常用的是第一种饿汉式,因为:
 (1)既然采用了单例设计模式,就是为了使用单例类的对象,所以就先把他实例化出来.
 (2)在懒汉式中存在一定的安全隐患,需要加上同步关键字synchronized,否则就谈不上单例了,但是加上了synchronized效率就稍逊了

2 在第一种办法中,代码private static final Single SINGLE=new Single();为什么有final呢?
因为被final关键字修饰的类,不能被继承,被final修饰的成员变量不可以被修改.
此处用了final为了强化和重点突出:"同一对象"这个概念——只有这么一个对象,而且它是不可以被修改的.
如果不用final修饰 Single SINGLE那么就会有这么一种情况:业务很复杂,在不经意间就修改了此对象,造成各种错误.

第一种(饿汉式):
//思路:
//(1)不让其他类建立该类的对象.即将构造函数设置为私有!
//(2)自定义一个本类对象
//(3)将自定义的对象提供出去.即定义一个get方法,返回值为此类的对象。
// 分析:
// 第一步:将单例类中构造函数私有化了且利用一个get()函数向外提供此类的对象,所以其他类无法构造此类的对象。
// 第二步:但其他类要想调用此单例类里的方法,于是只有采用内名.方法名()来实现,这就要求这个方法必须是静态static的。
// 第三步:又因为静态方法只能访问静态成员!所以要将SINGLE设置为静态的

public class SingleDemo {
    public static void main(String[] args) {
         Single s1=Single.getSingle();
         s1.setNumber(44);
         Single s2=Single.getSingle();
         s2.setNumber(55);
         System.out.println("s1.number="+s1.number);
         System.out.println("s2.number="+s2.number);
         if(s1.equals(s2)){
                System.out.println("s1与s2是同一对象即:s1==s2");//if条件成立
             }
      }
}


class Single{
    int number;
    public int getNumber() {
             return number;
         }
    public void setNumber(int number) {
             this.number = number;
         }
    private Single(){};//第一步
    private static final Single SINGLE=new Single();//第三步
    public static Single getSingle(){//第一步和第二步
             return SINGLE;
    }
}



第二种(懒汉式):
package cn.com;
public class SingleDemo2 {
     public static void main(String[] args) {
           Single s1=Single.getSingle();
           s1.setNumber(44);
           Single s2=Single.getSingle();
           s2.setNumber(55);
           System.out.println("s1.number="+s1.number);
           System.out.println("s2.number="+s2.number);
           if(s1.equals(s2)){
                System.out.println("s1与s2是同一对象即:s1==s2");//if条件成立
              }
          }


}


class Single{
     int number;
     public int getNumber() {
             return number;
         }
     public void setNumber(int number) {
             this.number = number;
         }
     private Single(){};
     private static Single SINGLE=null;
     public static synchronized Single getSingle(){//多线程时加上synchronized是关键!!!
            if(SINGLE==null){
                 SINGLE=new Single();
                  return SINGLE;
              }
           else{
                 return SINGLE;
               }
     }
}

相关文章
|
2月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
67 0
|
2月前
|
设计模式 缓存 安全
单例设计模式的优缺点
单例设计模式的优缺点
34 0
|
2月前
|
设计模式 XML 存储
关于 ABAP 单例设计模式的一个冷门知识点
关于 ABAP 单例设计模式的一个冷门知识点
23 0
|
2月前
|
设计模式 安全 Java
【设计模式】2、设计模式分类和单例设计模式
【设计模式】2、设计模式分类和单例设计模式
28 0
|
2月前
|
设计模式 Java
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
30 2
|
4月前
|
设计模式 消息中间件 安全
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(二)
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(二)
35 1
|
4月前
|
设计模式 安全 Java
最简单的设计模式是单例?
单例模式可以说是Java中最简单的设计模式,但同时也是技术面试中频率极高的面试题。因为它不仅涉及到设计模式,还包括了关于线程安全、内存模型、类加载等机制。所以说它是最简单的吗?
58 3
最简单的设计模式是单例?
|
2月前
|
设计模式 安全 Java
在Java中即指单例设计模式
在Java中即指单例设计模式
22 0
|
6月前
|
设计模式 存储
static应用之 单例设计模式(饿汉单例&懒汉单例)
本章我们来学习单例模式中的饿汉单例和懒汉单例,那么什么是单例模式呢?应用该模式的这个类永远只有一个实列,即一个类只能创建一个对象例如电脑上的任务管理器对象只需要一个就能解决问题,可以节省内存空间先定义一个类,把构造器私有如下图,先来看一下没有把构造器私有化的SingleInstance类,此时Test类中可以随意创建多个SingleInstance的实例化。 在SingleInstance类中用private修饰无参构造器,此时左边new方法报错了。我们在右边创建一个静态变量来存储对象,变量名为instan
27 0
|
16天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式