zoukankan      html  css  js  c++  java
  • 设计模式——单例模式

    • 饿汉模式
    package test.design.singleton;
    
    /**
     * 单例模式(饿汉模式)
     * 使用场景:当类只有一个实例,且可以从一个固定的点访问时,保证实例只有一个
     * 优点:在类加载时就完成了初始化,线程安全
     * Created by Z on 2017/4/17.
     */
    public class EagerSingleton {
    
        //静态变量
        private static EagerSingleton eagerSingleton = new EagerSingleton();
    
        /**
         * 私有构造函数
         * 不允许被外部所创建 保证只有一个实例
         */
        private EagerSingleton() {
            System.out.println("GetInstance");
        }
    
        public static EagerSingleton getInstance() {
            return eagerSingleton;
        }
    
        public void print() {
            System.out.println("This is EagerSington");
        }
    
    }
    
     class Test {
    
        public static void main(String[] args) {
            EagerSingleton.getInstance().print();
            System.out.println(EagerSingleton.getInstance());
    
    //        这样就会报错 因为构造函数是私有的不允许被外部创建
    //        EagerSingleton es =new EagerSingleton();
        }
    }

    输出:

    GetInstance
    This is EagerSington
    test.design.singleton.EagerSingleton@4a574795
    • 懒汉模式
    package test.design.singleton;
    
    /**
     * 单例模式(懒汉模式)
     * 使用场景同饿汉模式
     * 优点:在使用时加载,节省内存
     * Created by Z on 2017/4/17.
     */
    public class LasySingleton {
    
        private static LasySingleton lasySingleton = null;
    
        private LasySingleton() {
            System.out.println("GetInstance");
        }
    
        /**
         * 线程同步
         * 不加synchronized线程是不安全的
         * @return
         */
        public static synchronized LasySingleton getInstance() {
            if (lasySingleton == null) {
                lasySingleton = new LasySingleton();
            }
            return lasySingleton;
        }
    
        public void print() {
            System.out.println("This is LasySingleton");
        }
    }
    
    class TestLasySingleton {
        public static void main(String[] args) {
            LasySingleton.getInstance().print();
            System.out.println(LasySingleton.getInstance());
    
    //        这样就会报错 因为构造函数是私有的不允许被外部创建
    //        LasySingleton ls =new LasySingleton();
    
        }
    }

    输出:

    GetInstance
    This is LasySingleton
    test.design.singleton.LasySingleton@4a574795
    //和上一个分配的内存地址是一样的...
    • 总结

       饿汉模式:空间换时间;懒汉模式:时间换空间。一般用饿汉模式就可以了。

  • 相关阅读:
    ORACLE函数介绍
    msdn的javascript文章转载
    baidu的高级搜索命令
    周杰伦 青花瓷 蒲公英的约定 我不配 彩虹 歌词和下载
    谷歌百度相争 新浪渔翁得利
    tomcat+jsp web运行环境搭建
    C#2008与.NET 3.5 高级程序设计读书笔记(24) LINQ API编程
    C#2008与.NET 3.5 高级程序设计读书笔记(16) 类型反射、晚期绑定和基于特性的编程
    C#2008与.NET 3.5 高级程序设计读书笔记(15) .NET程序集入门
    C#2008与.NET 3.5 高级程序设计读书笔记(25) WCF
  • 原文地址:https://www.cnblogs.com/6324/p/6723808.html
Copyright © 2011-2022 走看看