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

  • 相关阅读:
    多表联合查询,利用 concat 模糊搜索
    order by 中利用 case when 排序
    Quartz.NET 3.0.7 + MySql 动态调度作业+动态切换版本+多作业引用同一程序集不同版本+持久化+集群(一)
    ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
    ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
    ASP.NET Core 2.2 基础知识(十六) SignalR 概述
    ASP.NET Core 2.2 基础知识(十五) Swagger
    ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
    linux磁盘管理 磁盘查看操作
    linux磁盘管理 文件挂载
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3807880.html
Copyright © 2011-2022 走看看