设计模式学习 单态Singleton

        工作一年了,由于部门职责的限制,虽然也接触了数据库设计、黑白盒测试等工作,但是自己更多的从事编码工作,按照详细设计书上的说明去实现后台业务逻辑。刚开始还有些自己的思想,到最后任务量加大,原本的编码工作完全变成了“Ctrl + C”、“Ctrl + V”的“完美组合”。

    最近决定学习一下设计模式,进行工作之余的自我“充电”。下面进入正题:先从最基础的设计模式——单态模式(Singleton)入手。

 

    单态模式: 即Singleton,它可以保证在Java应用程序中,一个类Class只有一个实例存在。

 

    《Head First-Design Pattern》一书中定义其作用如下:

     The Singleton Pattern ensures a class has only one instance, and provides a global point of access it. (确保每个类只有一个实例,并提供它的全局访问点)

    

    Singleton模式的使用可以节省资源,防止同一类创建多个重复的实例。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。

 

    主要有两种形式:

 

第一种形式:

 

 

 

 

public class SingletonPattern { 
      // 构造方法私有化 
    private SingletonPattern (){} 
     
      // 在自己内部定义自己一个实例,注意这是private 只供内部调用
    private static SingletonPattern instance = new SingletonPattern ();    
    // 这里提供了一个供外部访问本class的静态方法,可以直接访问 
    public static SingletonPattern getInstance() {      
        return instance;       
    } 
} 

 

 

 

 

 

第二种形式

 

public class SingletonPattern {   
    private static SingletonPattern singleton= null;   
    public static synchronized SingletonPattern getInstance() { 

     //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次       //使用时生成实例,提高了效率!    
       if (singleton==null) { 
              singleton=new SingletonPattern(); 
          }    
       
       return singleton;    
    } 
} 

 

 

 

    使用SingletonPattern.getInstance()可以访问单态类。

 

 

 

    第二中形式是lazy initialization,即第一次调用时初始SingletonPattern,以后就不用再生成了。

    注意到lazy initialization形式中的synchronized,(这个很重要),如果没有synchronized,那么使用 getInstance()是有可能得到多个Singleton实例。

 

 

 

 

 

 

利用“double-checked locking”来减少getInstance()方法必须是sychronized的改进:

 

 

 

 

 

 

public class SingletonPattern { 

    /** Local Variable */ 
    private static SingletonPattern singleton; 

    /** 
     * Private Constuctor 
     */ 
    private SingletonPattern () { } 
    
    // Get Instance Of SingletonPattern 
    public static SingletonPattern getInstance () { 

        if (singleton == null) { 

            synchronized (SingletonPattern.class) { 

                if (singleton == null) { 
                    singleton = new SingletonPattern(); 
                } 
            } 
        } 
        return singleton; 
    } 
}

 

 

      关于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的讨论,希望有什么好的见解,大家一起探讨。

 

测试:

 

public class SingletonPatternTest {

    /**
     * Test SingletonPattern Class
     */
    public static void main(String[] args) {
		
        // singleton1
        SingletonPattern singleton1 = SingletonPattern.getInstance();
		
        // singleton2 
        SingletonPattern singleton2 = SingletonPattern.getInstance();
		
        // compare singleton1 to singleton2
        if (singleton1 == singleton2) {
			
            System.out.println("The Instance Of SingletonPattern Class is one-of-a-kind !!");
		
        } else {
			
            System.out.println("The Instance Of SingletonPattern Class is not one-of-a-kind !!");
        }
    }
}

 

输出结果:

 

 

 

The Instance Of SingletonPattern Class is one-of-a-kind !!

 

 

    小弟出来乍到,有什么不对的地方请大家指出。不怕自己错,只怕错了自己不知道。o(∩_∩)o...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值