浅谈JAVASE单例设计模式

简单的说设计模式,其实就是对问题行之有效的解决方式。其实它是一种思想。

1.单例设计模式。
文章来源地址https://www.yii666.com/blog/115070.html

      解决的问题:就是可以保证一个类在内存中的对象唯一性。(单个实例)

      使用单例设计模式需求:必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。

      如何保证对象唯一性?                                                      解决步骤:网址:yii666.com<文章来源地址:https://www.yii666.com/blog/115070.html

      1.不允许其他程序用new创建该对象。                                            1.私有化该类构造函数。

      2.在该类创建一个本类实例。                                                         2.通过new 在该类中创建一个本类对象。

      3.对外提供一个方法让其他程序可以获取该对象。                            3.定义一个公有的方法,将创建的对象返回。

//饿汉式(开发时常用)
class Single//类一加载,对象就已经存在了。
{
  private static Single s = new Single();
 
  private Single(){}
 
  public static Single getInstance()
  {
    return s;
  }
}
 

 
网址:yii666.com

//懒汉式(面试时常问,在多线程并发访问时候有可能导致不能保证不了对象的唯一性,存在安全隐患!)
class Single2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。
      //延迟加载形式。 
{
  private static Single2 s = null;
 
  private Single2(){}
 
  public static Single2 getInstance()
  {
    if(s==null)
      s = new Single2();
    return s;
  }
}
 
//调用类
class SingleDemo
{
  public static void main(String[] args) 
  {
    Single s1 = Single.getInstance();
    Single s2 = Single.getInstance();
 
    System.out.println(s1==s2);
     
//   Single ss = Single.s; //此处不采用这个是因为不可控,采用 Single.getInstance();可以传参数进行相应调用。
 
  }
}

饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。
文章地址https://www.yii666.com/blog/115070.html

3.登记式:

代码:

package pattern.singleton;import java.util.HashMap;import java.util.Map;
 //登记式单例类.
 //类似Spring里面的方法,将类名注册,下次从里面直接获取。
public class Singleton3 {
 private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
 static{
 Singleton3 single = new Singleton3();
 map.put(single.getClass().getName(), single);
 }
 //保护的默认构造子
protected Singleton3(){}
 //静态工厂方法,返还此类惟一的实例
public static Singleton3 getInstance(String name) {
 if(name == null) {
 name = Singleton3.class.getName();
 System.out.println("name == null"+"--->name="+name);
 }
 if(map.get(name) == null) {
 try {
 map.put(name, (Singleton3) Class.forName(name).newInstance());
 } catch (InstantiationException e) {
 e.printStackTrace();
 } catch (IllegalAccessException e) {
 e.printStackTrace();
 } catch (ClassNotFoundException e) {
 e.printStackTrace();
 }
 }
 return map.get(name);
 }
 //一个示意性的商业方法
public String about() {
 return "Hello, I am RegSingleton.";
 }
 public static void main(String[] args) {
 Singleton3 single3 = Singleton3.getInstance(null);
 System.out.println(single3.about());
 }
 }

版权声明:本文内容来源于网络,版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。文本页已经标记具体来源原文地址,请点击原文查看来源网址,站内文章以及资源内容站长不承诺其正确性,如侵犯了您的权益,请联系站长如有侵权请联系站长,将立刻删除

领支付宝红包赞助服务器费用

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信图片_20190322181744_03.jpg

微信扫一扫打赏

请作者喝杯咖啡吧~

支付宝扫一扫领取红包,优惠每天领

二维码1

zhifubaohongbao.png

二维码2

zhifubaohongbao2.png