算是我的第一篇博客吧,之前一直也想要些,但是却一直停在了想写的这一阶段,今天决定写一篇关于单例模式的博客,既可以总结加深印象,提高个人技术,也是宣称程序员之路的正式开始吧,如果能够帮助其他人,就更好了,废话不多说,开始吧。
单例模式,顾名思义,举个栗子,就是只有一个栗子可以吃,哈哈开个玩笑。
下面进入正题(貌似已经开始过了,各位看官假装没看见)
单例设计模式是一种创建型模式,指某个类在使用Singleton模式的时候,则在这个类被创建后,只能产生一个实例对象供外部来访问使用,并且会提供一个全局的访问点。
其中核心点如下
1. 将采用单例设计模式的类的构造方法私有化(用private修饰),不允许其他类直接访问。
2. 在其内部产生该类的实例化对象,并将其封装成private static 类型。
3. 定义一个静态方法返回该类的实例。
/**
* 方法一
* 单例模式的实现:饿汉式,线程安全 但效率比较低
*/
public class Test {
//定义一个私有的构造方法
private Test() {
}
//将自身的实例对象设置为一个属性,并加上Static和final修饰
private static final Test test = new Test();
//静态方法返回类的实例
public static Test getInstance(){
return test;
}
}
优点:写起来简单,不存在多线程同步问题,避免了synchorized造成的性能优化问题。
缺点:
当这个类被加载时候,会初始化static test,静态变量被创建并分配内存空间,从此以后,这个static的test会一致占据着内存,即便没有用这个实例,zhi有当类被卸载销毁的时候,静态变量才会被摧毁,并释放所有的内存,因此某些特定的条件下会消耗内存。
public class Test {
//方法二
//懒汉式,线程不安全
//定义一个私有的构造方法,防止通过new Test去实例化。
private Test() {
}
//定义一个Test类型的变量(不初始化,因为后面要判断生成)
private static Test test;
//定义一个静态方法(调用时再初始化,但多线程访问时,可能造成重复的初始化问题)
public static Test getInstance(){
if(test == null){
test = new Test();
}
return test;
}
}
优点:当Test被加载的时候,test并没有被分配空间,因为是空的,只有当运行了getInstance的时候,才会创建test。
缺点:在实际运行中可能会出现多个test的实例。