Java的单例设计模式

1设计模式(Design pattern)

是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

-------------------------------------------------------------------------------------------------
定义一个数组的工具类(ArrayUtil),使用单例模式解决.

2.单例设计模式(singleton)

最常用,最简单的设计模式.单例的编写有N种写法.

目的:保证某一个在整个应用中某一个类有且只有一个实例(一个类在堆内存只存在一个对象),即所有指向该类型实例的引用都指向同一块内存空间。   
写单例模式的步骤:推荐使用饿汉式.因为懒汉式存在线程安全问题
      1):必须在该类中,自己先创建出一个对象.
      2):私有化自身的构造器,防止外界通过构造器创建新的对象.
      3):想外暴露一个公共的静态方法用于获取自身的对象                                                                                                                           
class ArrayUtil
{
	private static final ArrayUtil instance = new ArrayUtil(); //自己内部先创建对象

	private ArrayUtil(){} //构造函数私有化

	public static ArrayUtil getInstance(){  //提供公共方法给外部获取对象
		return instance;
	}

	public static void sort(){
		System.out.println("排序操作");
	}
}

class SingletonDemo 
{
	public static void main(String[] args) 
	{
		System.out.println(ArrayUtil.getInstance());//打印对象:ArrayUtil@7676438d
		System.out.println(ArrayUtil.getInstance());//打印对象:ArrayUtil@7676438d
		System.out.println(ArrayUtil.getInstance()==ArrayUtil.getInstance()); //true,每次拿的都是同一个对象
	}
}

其实这种方法也不太安全,因为Java存在反射机制,可以获取private修饰的所有成员,同样也能获取私有的构造函数来创建新的对象,其实最屌的单例设计模式是使用枚举,

//枚举实现单例
enum ArrayUtil
{
	INSTANCE;
	
	public static void sort(){
		System.out.println("排序操作");
	}
}

class SingletonDemo 
{
	public static void main(String[] args) 
	{
		System.out.println(ArrayUtil.INSTANCE);//打印对象:INSTANCE
		System.out.println(ArrayUtil.INSTANCE);//打印对象:INSTANCE
		ArrayUtil.INSTANCE.sort();//调用方法
	}
}

另一种:

class Resource 
{
	//这是需要实现单例的类,其中可以存放的是网络连接,数据库连接,线程池或者其他等等加载资源
}

enum SomeThing {
    INSTANCE;
    private final Resource instance;
    private SomeThing() {
        instance = new Resource();
    }
    public Resource getInstance() {
        return instance;
    }
}

public class TestDemo{
	 public static void main(String[] args){

		 System.out.println(SomeThing.INSTANCE.getInstance());
		 System.out.println(SomeThing.INSTANCE.getInstance());
	  
	 }
}

上面的类Resource是我们要应用单例模式的资源,具体可以表现为网络连接, 数据库 连接,线程池等等。 
获取资源的方式很简单,只要 SomeThing.INSTANCE.getInstance() 即可获得所要实例。下面我们来看看单例是如何被保证的:  首先,在枚举中我们明确了 构造方法限制为私有 ,在我们 访问枚举实例时会执行构造方法 ,同时 每个枚举实例都是static final 类型的,也就表明 只能被实例化一次 。在 调用构造方法时,我们的单例被实例化 。  也就是说,因为 enum中的实例被保证只会被实例化一次 ,所以我们的 INSTANCE也被保证实例化一次 。  可以看到,枚举实现单例还是比较简单的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值