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也被保证实例化一次 。 可以看到,枚举实现单例还是比较简单的