设计优化之单例模式

首先关于系统优化可以分为

1.设计优化

2.代码优化

3.数据库优化

大致分为这三个方面的优化,当然在针对这个系统的优化之前的前提是明确系统需求。

今天最要针对设计优化上一些讲解和心得笔记。当然谈到设计,我们首先想到的是设计原则和23种设计模式。

常见代码中设计到的几种设计模式

1.单例模式:保证系统中只有一个实例化对象。

2.代理模式

3.享元模式

4.装饰者模式

5.观察者模式

6.Value Object 模式

首先,我们来谈谈单例模式,先看一段代码

/**

* Created by Darker on 15/6/11.

*/

public class Singleton{

private static Singleton ourInstance=newSingleton();

public static Singleton getInstance(){

return ourInstance;

}

private Singleton(){

System.out.println("init Singleton");

}

}

上面的代码是,创建单例模式的常见方式,也是最容易上手的代码,但是它唯一的缺点就是在JVM 加载类的时候,就需要进行加载,时间太慢,直接影响到系统功能,所以要考虑到延迟加载。

然后,再来看看一段代码

/**

* Created by Darker on 15/6/11.

*/

public class Singleton{

private static Singleton ourInstance;

public static  Singleton getInstance(){

if(ourInstance==null){

ourInstance=newSingleton();

}

return ourInstance;

}

private Singleton(){

System.out.println("init Singleton");

}

}

当你看到这段代码的时候,你肯定觉得这种方式和上面的static 方式没什么区别,无非只是加了一个判断是否为null,确实做到延迟加载,哟西,等等…我们是不是忘记了多线程下,这段代码就会出问题,线程并行进行,判断为null,有可能就会出现多个instance。于是我们就线到同步关键字,synchronized。于是有了下面的代码.

/**

* Created by Darker on 15/6/11.

*/

public class Singleton{

private static Singleton ourInstance;

public static synchronized Singleton getInstance(){

if(ourInstance==null){

ourInstance=newSingleton();

}

return ourInstance;

}

private Singleton(){

System.out.println("init Singleton");

}

}

nice 啊!,是不是很帅.完全解决多线程下的问题,保证只有一个单例。等等,所谓的优化,是从空间和时间上进行用户啊,现在确实能保证空间,功能上没有差错,但是耗时?? 通过测试,static 单例,和 同步单例,在开启5个线程的同时耗时相差2个数量级,所以这段代码以耗时为代价,完成延迟加载,感觉有点得不偿失。说明还有更强大的单例代码设计。于是便有了下面一段代码.

/**

* Created by Darker on 15/6/11.

*/

public class Singleton{

private Singleton(){

System.out.println("init Singleton");

}

private static class SingletonHodler{
private static Singleton instance=newSingleton();

public static Singleton getInstance(){

return SingletonHodler.instance;

}

}

}

哇,强大的内部类,竟然出现在这段代码中,这样的实现方式,很棒吧,使用内部类来维护单例的实例,当Singleton被加载时,其中内部类并不会被加载,只有当调用getInstance()方法的时候,才能被加载,等等延迟加载是不是很屌的就解决了,对的。那么多线程下,这代码管用么?private static Singleton instance=new Singleton();这段代码,和第一种是一样的,对,这就是天生对多线程友好,所以也解决了。多线程同步的问题….nice 啊。

最后,当然..你用反射机制 也可以new出多个实例,但是这么极端…你就有点过啦..

你可能感兴趣的:(设计优化之单例模式)