java设计模式,单利模式

一、普通单利
二、synchronized单利
三、影子追踪测试
①普通单利
package com.dasenlin.singleton;
/**
 * 单利模式
 * 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
 * 1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
 * 2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
 * 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。
 * (比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
 * @author Administrator
 * 如果在构造函数中抛出异常,实例将永远得不到创建,也会出错。所以说,十分完美的东西是没有的,我们只能根据实际情况,选择最适合自己应用场景的实现方法。
 * 也有人这样实现:因为我们只需要在创建类的时候进行同步,所以只要将创建和getInstance()分开,单独为创建加synchronized关键字,也是可以的:
 */
public class Singleton {
    /**
     * 私有化构造方法
     */
    private Singleton(){

    }
    /**
     * 此处使用一个静态内部类来维护单例
     */  
    private static class SingletonFatory{
        private static Singleton instance = new Singleton();

    }
    /**
     * 获取实例
     * @return
     */
    public static Singleton getInstance(){
        return SingletonFatory.instance;
    }
    /**
     * 若对象被序列化,可以保证前后实例的是一样的
     * @return
     */
    public Object readResolve(){
        return getInstance();
    }
    public void say(){
        System.out.println("单例模式实例化成功后加载的一个方法");
    }
}

②synchronized单例
package com.dasenlin.singleton;
/**
 * 单例类比较灵活,毕竟从实现上只是一个普通的Java类,只要满足单例的基本需求,你可以在里面随心所欲的实现一些其它功能,但是静态类不行。
 * 从上面这些概括中,基本可以看出二者的区别,但是,从另一方面讲,我们上面最后实现的那个单例模式,内部就是用一个静态类来实现的,
 * 所以,二者有很大的关联,只是我们考虑问题的层面不同罢了。两种思想的结合,才能造就出完美的解决方案,就像HashMap采用数组+链表来实现一样,
 * 其实生活中很多事情都是这样,单用不同的方法来处理问题,总是有优点也有缺点,
 * 最完美的方法是,结合各个方法的优点,才能最好的解决问题!
 * @author Administrator
 */
public class Singleton2 {
    /**
     * 单独提出静态类常量
     */
    private static Singleton2 instance=null;
    /**
     * 私有化构造方法
     */
    private Singleton2(){

    }
    /**
     * 同步线程安全的实例
     */
    private static synchronized void syncInit(){
        if(null==instance){
            instance =new Singleton2();
        }
    }
    /**
     * 提供公共的方法让外部实例化该类
     * @return
     */
    public static Singleton2 getInstance(){
        if(null==instance){
            syncInit();
        }
        return instance;
    }
    /**
     * 类中方法
     */
    public void say(){
        System.out.println("这是第第二种单利提出到工厂外实例");
    }
}
③影子追踪测试
package com.dasenlin.singleton;

import java.util.Vector;

public class SingletonTest {

private static SingletonTest instance = null;  
private Vector properties = null;  

public Vector getProperties() {  
    return properties;  
}  

private SingletonTest() {  
}  

private static synchronized void syncInit() {  
    if (instance == null) {  
        instance = new SingletonTest();  
    }  
}  

public static SingletonTest getInstance() {  
    if (instance == null) {  
        syncInit();  
    }  
    return instance;  
}  

public void updateProperties() {  
    SingletonTest shadow = new SingletonTest();  
    properties = shadow.getProperties();  
}  
} 

/**
 * 测试类
 * @author Administrator
 *
 */
public class Test{
    public static void main(String[] args) {
        Singleton sin=Singleton.getInstance();
        sin.say();
        Singleton2 sin2=Singleton2.getInstance();
        sin2.say();
        SingletonTest sin3=SingletonTest.getInstance();
        sin3.updateProperties();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值