单列设计模式:
就本人理解,所谓的单例就是在程序运行的整个周期,类的实例仅存在一个。
说到单例可能大家都会想到两种设计方法:饿汉式和懒汉式。
饿汉式:
//饿汉式的设计
public class Sington
{
//被设计为单例的对象
private static final Student student =new Student();
//私有化构造方法
private Sington(){}
//获取实例
public static Student getInstance()
{
returnstudent;
}
}
//但是仔细想想饿汉式的设计方式存在一个弊端就是在类加载的时候相关变量就会被实例//化,很显然这样就占用了系统资源,影响了系统的效率。
//懒汉是的单例设计
public class LazySington
{
//声明要取得的实例的引用
private static Student student;
//私有化构造器
private LazySington(){}
//取得实例
public static Student getInstance()
{
synchronized(LazySington.class)
{
//很显然在多线程情况先1处存在线程安全问题,通常我们的解决办法是在该处加上锁机制
if (student ==null)//{1}
student =new Student();
}
returnstudent;
}
}
//仔细想想懒汉式的设计方式也存在一定的弊端,因为它存在线程安全问题,需要加锁机制//来解决问题,但是这样的话对于多用户的使用的话就会影响系统的性能。
//再来谈谈饿汉式设计方式的优点:不存在线程安全问题
//懒汉式的设计方式:可以延迟类的加载(在此我也是参看了相关资料找到的最好的单例设计//方式,但是我还是有疑问,下面我还是以相关代码来体现)ji
//最优的单例设计思想
public class BestSington
{
//私有化构造器
private BestSington(){}
//定义内部类来为外部类创建实例,实现类的延迟加载
private static class InnerBuilder
{
private static final Student STUDENT =new Student();
}
//获取实例
public static Student getInstance()
{
returnInnerBuilder.STUDENT;
}
}
//我觉得这样做只是延迟了变量的实例化并没有延迟类的加载
//因为类的加载是在第一次调用静态的(static)getInstance()时加载的,而饿汉式的方式获取的//实例的话也是在第一次调用静态的(static)getInstance()时加载的,所以我并不认为在此提高//了系统的效率。
备注:本人也是刚接触设计模式,对于有些理解有误的地方希望大家能够帮忙指出,毕竟相互学习才能进步,我写博客的原因也是出于这个目的。