美文网首页
Java的23种模式之单例模式

Java的23种模式之单例模式

作者: 安安静静写代码 | 来源:发表于2017-08-03 22:06 被阅读4次

单例模式也可以叫做单例,具有以下特点:
1.一个类只能创建对象
2.可以节省空间
3.单独可以避免因多个实例造成的最终结果冲突
分类:1.饿汉式
2.懒汉式
如何产生单例
1.不能随便让外界调用到构造方法
2.私有构造方法
3.自己本类调用构造方法创建对象
以下是两种模式的实例代码
饿汉模式

package com.qf.demo3;

public class HuangryInstance {
    
    private HuangryInstance()  //创建私有化构造方法
    {
        
    }
    private final static HuangryInstance huangryInstance  = new 
        HuangryInstance();   //调用自己本类构方法创建对象
    public static HuangryInstance getHuangryinstance() {    //对外留一个访问函数
        return huangryInstance;
    } 
    
}

懒汉模式

package com.qf.demo3;

public class LazyInstance { 
    
    // 1私有化构造方法
    private LazyInstance()
    {
    
    }
    private static LazyInstance instance; //声明一个私有的静态引用变量
    public static LazyInstance getInstance()
    {
        if(instance==null)
        {
             instance = new LazyInstance();    //创建本类对象并给提前声明的引用变量
        }       
        return instance;
    }
        
}

测试两个模式

单例模式

一个类只能有一个对象

1.可以节省内存空间
2.可以避免因多个实例造成的最终结果冲突

分类
1.饿汉式
2.懒汉式
如何产生单例
1.不能随便让外界调用到构造方法
2.私有构造方法
3.自己本类调用构造方法创建对象

1.饿汉式:
1私有化构造方法
2自己本类 调用构造方法创建一个对象 final
3创建一个get方法为外界提供 这个对象

2.懒汉式
1私有化构造方法
2 添加私有属性 并不初始化
3 添加对外访问的接口 getInstance
在这个方法里面判断 当 属性为null 创建对象,不为null 则直接返回
4 将 方法和属性设置为 静态的

线程安全上:饿汉是线程安全的
懒汉是线程不安全的

package com.qf.demo3;
public class Test {

    public static void main(String[] args) {
        //创建三个不同对象输出打印,观察三个对象地址是否一样
        HuangryInstance huangryInstance = HuangryInstance.getHuangryinstance();
        System.out.println(huangryInstance);
        HuangryInstance huangryInstance2 = HuangryInstance.getHuangryinstance();
        System.out.println(huangryInstance2);
        HuangryInstance huangryInstance3 = HuangryInstance.getHuangryinstance();
        System.out.println(huangryInstance3);
          
        /*
                 *输出三个对象的地址
         * com.qf.demo3.HuangryInstance@1db9742
                  com.qf.demo3.HuangryInstance@1db9742
                   com.qf.demo3.HuangryInstance@1db9742
         */
                
        //创建三个不同对象输出打印,观察三个对象地址是否一样
        LazyInstance lazyInstance = LazyInstance.getInstance();
        System.out.println(lazyInstance);
        LazyInstance lazyInstance2 = LazyInstance.getInstance();
        System.out.println(lazyInstance2);
        LazyInstance lazyInstance3 = LazyInstance.getInstance();
        System.out.println(lazyInstance3);
        
        /*
                   * 输出三个对象的地址值
           * com.qf.demo3.LazyInstance@106d69c
                   * com.qf.demo3.LazyInstance@106d69c
                   *com.qf.demo3.LazyInstance@106d69c
        */
        
    }

}

相关文章

网友评论

      本文标题:Java的23种模式之单例模式

      本文链接:https://www.haomeiwen.com/subject/rkdmlxtx.html