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
    //和上一个分配的内存地址是一样的...
    • 总结

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

  • 相关阅读:
    java线程实现和集合类综合问题
    软件体系结构风格总结
    java如何实现对象的克隆
    24小时实现盲打(程序员快速入门)
    测试面向对象软件时,设计集成测试用例的方法
    对白盒测试的一些理解
    对于工程建模需要画的图的分析及体会
    在软件开发的早期阶段为什么要进行可行性研究?应该从哪些方面研究目标系统的可行性?
    谭静第一周任务
    陈林艳第一周任务
  • 原文地址:https://www.cnblogs.com/6324/p/6723808.html
Copyright © 2011-2022 走看看