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

    所谓单例,即使单一的实例,就是要保证对象只有一个。

    单例模式:单一的实例,保证类在内存中的只有一个对象。
     举例:windows的打印服务,网站计数器
     java的应用:Runtime
     
     
     2.如何保证类在内存中只有一个对象?
     
     A:把构造器方法私有,为了不让外界创建对象
     B:在类中去创建一个对象
     C:通过一个公共的访问方式给外界提供一个入口

    单例模式,分饿汉式或懒汉式。

    下面请看饿汉式

    package cn.itcast_singleton;
    
    public class Student {
        //为了不让外界访问,我们把构造器方法私有
        private Student(){};
        
    
        //创建一个对象
        //为了满足静态方法访问,这里必须加一个静态修饰符
        //为了不让外界修改s对象,加私有修饰
        private static Student s=new Student();
        
        //提供一个公共的访问方式
        //为了让外界直接访问,我们就给方法添加一个静态修饰符
        
        public static Student getStudent(){
                return s;
        }
        
        public void show(){
            
            System.out.println("i love java");
        }
    
    }
    
    
    package cn.itcast_singleton;
    
    public class StudentTest {
        public static void main(String[] args){
    //        Student s1=new Student();
    //        Student s2=new Student();
    //        System.out.println(s1==s2);
            
            //由于成员变量是被静态修饰的,所以外界也可以通过类名访问
            //Student.s=null;
            
            
            
            //通过单利模式获取对象并调用方法
            Student s1=Student.getStudent();
            Student s2=Student.getStudent();
            System.out.println(s1==s2);
            s1.show();
            s2.show();
            
        }
    }

    再看 懒汉式

    懒汉式单例模式:
    延迟加载思想:我们什么时候需要对象,你什么时候给我对象就可以了。(Hibernate,Spring)
    第一次访问的时候去创建,, 第二次去访问是不创建的

    package cn.itcast_singleton;
    
    public class Teacher {
        //为了不让外界创建对象,把构造方法私有
        private Teacher(){}
        //本来创建一个对象
        //加static 是为了保证静态方法可以访问
        //夹private是为了保证外界不能直接访问
        
        private static Teacher t=null;
        
        //提供公共访问的方式
        public  static Teacher getTeacher(){
            //比如说我有t1和t2同时来访问,那么,这个时候,
            //当t1进来后,判断这个t是null,
            //所以,t1就进去执行if所控制的语句
            //但是注意了,由于线程的随机性,可能t1刚进去要执行if所控制的语句
            //这个时候,被t2抢到的CPU的执行权,者古时候,t2就开始执行了
            //发现,这个时候还是null,所以,t2也进去执行if所控制的语句了
            //那么,会有多个对象被创建
            
            //Runtime
            
            
            
            
            
            
            
            if(t==null){
                t=new Teacher();
            }
            
            return t;
        }
        
        //写了一个方法
        public void  show(){
            
            System.out.println("老师爱林青霞");
        }
        
        
        
    
    }
    
    
    package cn.itcast_singleton;
    
    public class TeacherTest {
        public static void main(String[] args) {
    //        Teacher t1=new Teacher();
    //        Teacher t2=new Teacher();
            
            Teacher t1=Teacher.getTeacher();
            Teacher t2=Teacher.getTeacher();
            
            t1.show();
            t2.show();
            
        }
    
    }

    那么,我们在开发中到底用到谁呢?

    一般我们开发中采用第一种方案  也就是饿汉式

    原因:
    前提:多线程安全问题


    面试的时候,会面试懒汉式。
    并且 请注意,面试懒汉式主要是面试一下几个问题:
    A:延迟加载思想   啥时用,啥时再创建
    B:线程安全
          a.线程安全问题是怎么产生的。
       b.现在安全问题是怎么解决的。

     6:其实在JDK提供的类中,已经有单例模式的应用,是谁呢?Runtime类 
    从这个类的源码中,可以看出
    开发中用的是饿汉式

  • 相关阅读:
    C#遍历指定路径下的文件夹
    ArcEngine的拓扑分析之ITopologicalOperator
    ArcEngine的拓扑分析之ITopologicalOperator
    输出旋转方形数字图形
    hdu4861(游戏)
    动态规划解决最长公共子序列问题(转)
    求解概率的坑题
    最后一周第二天训练赛之第二题
    最后一周训练赛第一题
    洛谷—— P2690 接苹果
  • 原文地址:https://www.cnblogs.com/vinplezhang/p/3660551.html
Copyright © 2011-2022 走看看