zoukankan      html  css  js  c++  java
  • 张小二求职 之单例模式(一)

    单例模式(一)

     

    本文以初级程序员的角度来分析设计模式。

    1.请问什么是设计模式?

    简单来说就是针对特定问题的解决方案。

    2设计模式可以帮助我们什么?

    我们在设计数据库的时候有范式理论,还记得不?我不记得了,以后复习。范式理论是指导我们设计数据库的表,他是我们设计数据库的一个指导原则,他的目标是减少冗余。简单来说,作为一个java程序员,我们每天都在写各种各样的类,这些类之间不是孤立的,他们是是有联系的一个整体,不同的类之间协作构成了我们庞大的程序。因此如何设计这些类呢?设计模式就是一些指导我们设计这些类的原则。什么高内聚和低耦合,这块也得复习一下。

    3、

    同学,你用过哪些设计模式啊,给我们说说吧?

    该同学窃喜,因为它昨天刚看了单例模式。于是出现了如下对话?

    M表示面官,Z表示张小二:问题会被加粗

    M:既然你会单例模式,你写出来一个我看看。(看我问不死你)

    z:
    package 单例模式;
    
     class Singleton2 {
         private static Singleton2 instance=new Singleton2();
         private Singleton2()
         {
             System.out.println("对象创建了");
         }
         public static Singleton2 getInstance()
         {
             return instance;
             
             
             
         }
             
    
    }
     public class Test6
     {
         public static void main(String args[])
         {
             Singleton2 s1=Singleton2.getInstance();
             Singleton2 s2=Singleton2.getInstance();
                 
             
             
             
         }
         
         
         
     }

    运行两次 getInstace构造函数只调用一次。

    M;你这段代码是如何保证每个类只生成一次对象的?

    1.类的静态变量只初始化一次

    M:不错,但是你你一定还会其他方法吧,这个方法是有缺陷的,因为类的初始化工作不一定只在调用getInstace时候才会出现啊。

    Z:是的,即使我们不调用getInstacne,对象也有可能会被创建。因此,我们无法做到按需创建。

    例如:

    Class.forName("单例模式.Singleton2"); 
    这个简单来说就是装载类,就是把class文件装载到虚拟机上,这个与反射有很大关系,在动态代理和工厂模式上都有,以后复习。

    同时调用其他静态方法

    M:很好,你的功底不错,那你写个线程安全,又可以按需创建的单例模式

    Z:张小二,提笔写到,

    package 单例模式;
    
     class Singleton2 {
        
         private Singleton2()
         {
             System.out.println("对象创建了");
         }
         private static class Sigleton2Holder
         {
             private static Singleton2 instance=new Singleton2();
             
             
         }
         public static Singleton2 getInstance()
         {
             return Sigleton2Holder.instance ;
             
             
             
         }
    
    
    }
     public class Test6
     {
         public static void main(String args[]) 
         {
            
             Singleton2 s1=Singleton2.getInstance();
             Singleton2 s2=Singleton2.getInstance();
             if(s1==s2) 
             {
                 System.out.println("对象时一样的");
             }
             else
             {
                 System.out.println("对象时不一样的");
             }
            
             
             
             
             
         }
         
         
         
     }

    M:你很牛逼啊我问你这个你是怎么解决一个类只创建一个实例的

    z:我使用一个静态内部类,专门用来获得对象,对于内部类,他的静态变量只出初始化一次,但是我保证了只有调用getinstace的时候进行初始化。

    (此处需要复习内部类)

    下篇单例模式,主要结合多线程讲解,博大精深啊

    http://www.cnblogs.com/coffee/archive/2011/12/05/inside-java-singleton.html

  • 相关阅读:
    u-boot启动流程分析(1)_平台相关部分
    Linux文件系统简介
    PHP将部分内容替换成星号
    自制jQuery焦点图切换简易插件
    一次解决页面特效问题的排查记录
    自制jQuery标签插件
    一套后台管理html模版
    自制jquery可编辑的下拉框
    注册页面的一些记录
    CSS选择器的一些记录
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3807880.html
Copyright © 2011-2022 走看看