博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式--Head First设计模式【笔记】
阅读量:7036 次
发布时间:2019-06-28

本文共 3455 字,大约阅读时间需要 11 分钟。

红与黑关于小小单件的问答

如何创建一个对象?                                             new MyObject();
万一另一个对象想创建MyObject会怎么样?可以再次new MyObject吗?    是的,当然可以
所以,一旦有一个类,我们是否都能多次地实例化它?                   如果是公开的类,就可以
如果不是的话,会怎么样?                                       如果不是公开类,只有同一个包内的类可以实例化它,                                                             但是仍可以实例化它多次。
嗯!有意思!你知道可以这么做吗?                                我没想过。但是,这是合法的定义,有一定道理public  MyClass{    private MyClass(){}}
怎么说呢?                                                   我认为含有私有的构造器的类不能被实例化
有可以使用私有的构造器的对象吗?                                嗯,我想MyClass内的代码是唯一能调用此构造器的代码,                                                            但是这又不太合乎常理。
为什么?                                                    因为必须有MyClass类的实例才能调用MyClass构造器,但是因为                                                            没有其他类能够实例化MyClass,所以我们得不到这样的实例。                                                            这是“鸡生蛋,蛋生鸡“的问题。我可以在MyClass类型的对象上使用                                                            MyClass构造器,但是在这之前,必须有一个MyClass实例。                                                            在产生MyClass实例之前,又必须在MyClass实例内才能调用私有的                                                            构造器。。。
嘿! 我有个想法。你认为这样如何?                              MyClass有一个静态方法。我们可以这样调用这个方法:public MyClass                                             MyClass.getInstance();{   public  static MyClass getInstance(){}}
为何调用的时候用MyClass的类名,而不是用对象名?                 因为getInstance()是一个静态方法,换句话说,是一个”类“方法。                                                           引用一个静态方法,你需要使用类名。
有意思。假如把这些合在一起”是否“就可以初始化一个MyClass?        当然可以public  MyClass{      private  MyClass(){}      public static MyClass getInstance()      {          return new MyClass();      }}
好了,你能想出第二种实例化对象的方式吗?                        MyClass.getInstance();
你能够完成代码使MyClass只有一个实例被产生吗?                  嗯,大概可以吧。。。
//黑用一个黑夜整出来的单例模式public  class  Singleton {       private  static Singleton  uniqueInstance;//用一个静态变量来记录Singleton类的唯一实例      private   Singleton(){}      public   static  singleton getIntance()      {          if(null==uniqueInstance)//如果我们不需要这个实例,就永远不会产生,这就是”延迟实例化“          {            uniqueIntance=new Singleton();          }          return uniqueIntance;       }   }

这样就真的能保证一个类只有一个实例,并提供一个全局访问点?在多线程中如果有两个线程都要执行这段代码呢?那又会怎么样?

怎么办?怎么办!怎么办?怎么办?!!!!!!!!!!!!!!!!!!!!!!!

不要急,天塌下来有高个子顶着。前人早就想好了解决方法。随我来一一了解它们吧。

//方法一:饥汉模式 public  class Singleton    {        //使用readonly关键用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。        private static readonly Singleton uniqueInstance=new Singleton ();private Singleton() { }       public static  Singleton getInstance()        {           if (null == uniqueInstance)           {               uniqueInstance = new Singleton();           }           return uniqueInstance;       }    }

 

//方法二:使用了双重锁方式较好地解决了多线程下的单例模式实现 public  class Singleton    {        private static Singleton uniqueInstance;        private static object _lock = new object();        private Singleton() { }       public static  Singleton getInstance()        {           if (null == uniqueInstance)//确认要实例化后再进行加锁,降低加锁的性能消耗。           {               lock (_lock)               {                   if (null == uniqueInstance)                    {                       uniqueInstance = new Singleton();                   }               }                 }           return uniqueInstance;       }    }

 比较下这两种方法,你感觉哪种方法更好?

转载于:https://www.cnblogs.com/Techlink/archive/2012/08/29/2662902.html

你可能感兴趣的文章
seleium_元素定位
查看>>
在VS2008中调用Matlab的m文件
查看>>
读Xamarin文档记录
查看>>
Mysql Commands
查看>>
[转载]关于eclipse提示:"The superclass "javax.servlet.http.HttpServlet" was not found on the
查看>>
MOSS网站集的迁移
查看>>
嵌入式软件测试工具―Winams
查看>>
POJ 3111 K Best
查看>>
HDU 3480 Division
查看>>
python-凯撒密码
查看>>
Spring任务调度之Quartz集成
查看>>
5.如何使主机和虚拟机IP处于同一网段(内网渗透专用)
查看>>
Kali信息收集系列:(都是我以前的笔记整理了一下,就没加水印,习惯就好)...
查看>>
PL/SQL查询设计器
查看>>
jsonp是什么
查看>>
Unity加载模块深度解析(Shader)
查看>>
雷林鹏分享:MySQL 处理重复数据
查看>>
单元测试笔记
查看>>
【转】数据库范式(1NF 2NF 3NF BCNF)详解一
查看>>
如何用css将一个div设置为一个圆
查看>>