zoukankan      html  css  js  c++  java
  • Java 面向对象 --单例模式

    在长期的程序设计过程中,开发者们总结出了很多设计经验,最终经过整理和优化,变成了如今的设计模式;

    设计模式有很多 有单例,工厂,代理等等。这里推荐一本关于Java设计模式的书籍 Head First设计模式

    今天我们这里讲解的是最常用的单例模式;

    在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在;

    有两种实现,一种是饿汉式,一种是懒汉式;

    我们上下代码,先上 饿汉式实现:

    package com.java1234.chap03.sec18;
     
    public class Singleton {
     
        /**
         * 构造方法私有
         */
        private Singleton(){
             
        }
         
        /**
         * 饿汉式单例实现
         */
        private static final Singleton single=new Singleton();
         
        /**
         * 获取实例
         */
        public static Singleton getInstance(){
            return single;
        }
    }

    这里我们构造方法私有 这样就保证了在外部是无法来实例化对象;

    然后我们先在内部定义一个静态常量对象,然后再写一个static方法 来返回这个对象,这样就保证是一个对象了;

    package com.java1234.chap03.sec18;
     
    public class Test {
     
        public static void main(String[] args) {
            Singleton singleton1=Singleton.getInstance();
            Singleton singleton2=Singleton.getInstance();
            System.out.println(singleton1==singleton2);
        }
    }

    运行输出:

    true

    这里获取里两个对象 我们前面讲过 用“==”来判断对象是否指向同一个内存区域,这里返回true,说明是同一个对象;

    我们这里再来实现下 懒汉式子:

    package com.java1234.chap03.sec18;
     
    public class Singleton2 {
     
        /**
         * 构造方法私有
         */
        private Singleton2(){
             
        }
         
        /**
         * 懒汉式单例实现 在第一次调用的时候实例化
         */
        private static Singleton2 single;
         
        /**
         * 获取实例
         */
        public synchronized static Singleton2 getInstance(){
            if(single==null){
                System.out.println("第一次调用的实例化");
                single=new Singleton2();
            }
            return single;
        }
    }

    我们可以看到 区别  饿汉式是先定义实例的 而懒汉式是先定义引用,当第一次调用getInstance的时候 进行对象实例化操作;

    当然这里我们考虑到多并发的情况 多个线程同时调用这个方法的时候,会出现问题,所以我们加了同步锁 synchronized 来保证

    同一时刻只有一个线程进入方法;

    package com.java1234.chap03.sec18;
     
    public class Test {
     
        public static void main(String[] args) {
            Singleton singleton1=Singleton.getInstance();
            Singleton singleton2=Singleton.getInstance();
            System.out.println("饿汉式:"+(singleton1==singleton2));
             
            Singleton2 singleton3=Singleton2.getInstance();
            Singleton2 singleton4=Singleton2.getInstance();
            System.out.println("懒汉式:"+(singleton3==singleton4));
             
        }
    }
    运行输出:
    
    饿汉式:true
    
    第一次调用的实例化
    
    懒汉式:true
  • 相关阅读:
    PHP-------抽象和接口
    MySQL函数
    MySQL索引
    MySQL语法
    MySQL视图、事务
    最简洁粗暴版的虚拟用户配置FTP
    linux网络bond技术
    CentOS 7服务
    Nginx 基础
    shell 截取指定的字符串
  • 原文地址:https://www.cnblogs.com/xyg-zyx/p/9831794.html
Copyright © 2011-2022 走看看