zoukankan      html  css  js  c++  java
  • 第一讲、单例模式

    1.定义

    单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

    GOF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局方法。

    2.为什么要使用单例模式?

    在开发中,经常有如下需求:

    • 在多个线程之间,比如servlet环境,共享一个资源或者操作同一个对象。
    • 在整个程序空间使用全局变量,共享资源。
    • 大规模系统中,为了性能考虑,需要节省对象的创建时间等。

    3.单例模式实现

    • 饿汉式
    • 懒汉式
    • 双重检查

    4.代码演示

    /**
     * 饿汉式    (是线程安全的)
     * 
     */
    public class Person {
        private String name;
        //静态常量
        private static final Person per = new Person();
        
        //构造函数私有化
        private Person() {
            
        }
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        //提供一个全局的静态方法
        public static Person getPersonInstance() {
            return per;
        }
    }
    package test.com.singleton;
    /**
     * 懒汉式    (线程不安全)
     *
     */
    public class Person2 {
        private String name;
        private static Person2 per;
        
        //构造函数私有化
        private Person2() {
            
        }
        
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
        //提供一个全局的静态方法
        public static Person2 getPerson2Instance() {
            //因为new也是需要时间的,在多线程的情况下会出现第一个new未执行完,多次new的情况
            if(null == per) {
                per = new Person2();
            }
            return per;
        }
    }
    package test.com.singleton;
    /**
     * 双重检查 (线程安全的)
     *
     */
    public class Person3 {
        private String name;
        private static Person3 per;
        
        //构造函数私有化
        private Person3() {
            
        }
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
        //提供一个全局的静态方法
        public static Person3 getPerson3Instance() {
            if(null == per) {
                //加锁的意义在于确保第一次new执行完
                synchronized(Person3.class) {
                    if(null == per) {
                        per = new Person3();
                    }
                }
            }
            return per;
        }
        
    }
    package test.com.singleton;
    /**
     * 测试
     *
     */
    public class Main {
        public static void main(String[] args) {
            Person per = Person.getPersonInstance();
            Person per1 = Person.getPersonInstance();
            per.setName("李青");
            per1.setName("李小青");
            System.out.println(per.getName());//李小青
            System.out.println(per1.getName());//李小青
            System.out.println(per == per1);
            
            Person2 per3 = Person2.getPerson2Instance();
            Person2 per4 = Person2.getPerson2Instance();
            per.setName("赵青");
            per1.setName("赵小青");
            System.out.println(per.getName());//赵小青
            System.out.println(per1.getName());//赵小青
            System.out.println(per3 == per4);
        }
    }

     5.相关文章

    noteless

  • 相关阅读:
    shell:bash基本特性
    python_day02
    python_day01
    centos环境下安装python3以及pip3
    http1到http3的巨大变化
    HTTP协议
    bootstrap
    JQuery
    BOM与DOM
    23种设计模式的几种常见的设计模式
  • 原文地址:https://www.cnblogs.com/zheaven/p/9881448.html
Copyright © 2011-2022 走看看