zoukankan      html  css  js  c++  java
  • linkin大话设计模式--单例模式

    linkin大话设计模式


    开文前先弱弱的问一句:什么是设计模式?我在研究java2ee的时候有研究过,在学js的时候也有看到。设计模式的概念最早源于建筑设计大师《建筑的永恒算法》一书,它表示一个特定的环境,一类问题和一个解决方案之间的关系。对于软件领域,设计模式就是对处于特定的环境下,经常出现的某类软件开发问题的,一种相对成熟的设计方案。


    设计模式(Design pattern)是一套被反复使用,多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。设计模式有好多,如下中选中的是比较常用的也是比较重要的模式,我会在具体的介绍后贴出相应的代码,方便以后查看。


    • 一、单例模式

    常见单例模式类型:
    饿汉式单例
    懒汉式单例

    懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。初始化对象的时候直接new出单例。

    饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。初始化对象的时候null,用到的时候判断,要是单例是null,才会去new。

    这两种模式对于初始化较快,占用资源少的轻量级对象来说,没有多大的性能差异,选择懒汉式还是饿汉式都没有问题。但是对于初始化慢,占用资源多的重量级对象来说,就会有比较明显的差别了。所以,对重量级对象应用饿汉模式,类加载时速度慢,但运行时速度快;懒汉模式则与之相反,类加载时速度快,但运行时第一次获得对象的速度慢。

    从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式,我们推荐使用饿汉模式。




    具体的代码如下:

    /**
     *
     * @version 1L
     * @author  LinkinPark 
     * @since   2014-10-31
     * @motto   梦似烟花心似水,同学少年不言情
     * @desc    ^这里这种是懒汉模式,会有线程安全问题。其实还有更加完美的写法:避免多线程创建多个实例  ----->双重检查锁定
     *              大牛推荐使用恶汉模式,就是下面这个用来缓存实例的变量instance直接赋值new Singleton()。
     */
    public class Singleton {
        //使用一个变量来缓存曾经创建的实例
        private static Singleton instance;
    
        //使用private限定符,隐藏构造器
        private Singleton() {
    
        }
        
        //暴漏静态方法,用于获得singleton的单例,方法内可以加入自己定义的逻辑。
        public static Singleton getInstance() {
            //如果实例存在了 就不要重复创建了  保证每次获得的就是第一次创建好的实例    对于下面这种双重检查锁定的方法  显得有点太复杂了耶
            /*if (instance == null) {
                synchronized(Singleton.class){
                    if(instance == null){
                        instance = new Singleton();
                    }
                }
            }*/
            if(instance == null){
                instance = new Singleton();
            }
            return instance;
        }
    
        public static void main(String[] args) {
            Singleton singleton1 = Singleton.getInstance();
            Singleton singleton2 = Singleton.getInstance();
            //输入是true     其中2个实例对象其实就是instance
            System.out.println(singleton1 == singleton2);
        }
    
    }


    使用枚举来实现单例模式的好处是这样非常简洁,并且无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。
      ——来自《Effective Java》(作者:Josh Bloch)
    代码如下:
    public enum Singleton {
        INSTANCE;//唯一实例
    
        public static Singleton getInstance(){
            return INSTANCE;
        }
    
        public void show(){
    	System.out.println("使用enum实现单例模式");
        }
    }



    <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);">在java2ee中,单例模式是一种应用非常广泛的设计模式。应用的好多组件都需要单个实例,这个时候就考虑使用单例模式。使用单例模式主要是有2个优势:</span>

    1:减少创建java实例所带来的系统开销;

    2:便于系统跟踪单个java实例的生命周期,实例状态等

     
















    风流子弟曾少年,多少老死江湖前。。。
  • 相关阅读:
    Collection(集合)知识点总结
    【Mysql 学习】mysql 的使用复习
    解决Address localhost:1099 is already in use
    mysql8.0中dcl语句修改密码的语法
    mysql+sqlyog 多表查询练习
    MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法
    JDBC连接Mysql 8.0.12版本的几个注意事项
    JSTL学习
    64-多个参数个数
    63-参数的使用
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233193.html
Copyright © 2011-2022 走看看