摘要:单件模式提供这个实例的全局访问点。实现单件模式,需要私有构造器,一个静态方法,一个静态变量。设计到多线程问题,同步会降低程序效率。
拥有独立且唯一的对象
这次讲述的是单件模式,就是整个内容里只有一个实例化“唯一”对象。这么说可能有点拗口,这么说吧,比方说,线程池,缓存,注册表,日志文件,甚至做JDBC中连接,关闭,增删改查数据库的Connection类(个人命名也许并不一样)、工具类等等。这些东西往往是要实例一次,就能在整个项目中使用了。
单件模式并不难理解定义如下
单件模式:确保一个类中只有一个实例,并提供一个全局访问点。
是的就这么一句话的定义。一般单件模式分为“懒汉式”和“饿汉式”做法
直接上代码。
“懒汉式”做法
package singleton01;
public class Singleton01 {
// 利用一个静态变量记录本类当中唯一的实例(mySingleton01)
private static Singleton01 mySingleton01 = null;
public Singleton01() {
}
// synchronized关键字:线程同步锁,在多线程中去互斥地访问临界资源
// 迫使每个线程在进入方法之前,要先等别的线程执行完离开方法后才能执行,达到多个线程排队,不会造成有多个线程同时进入这个方法
// 即是同步。但同步会使程序效率降低
public static synchronized Singleton01 getInstance() {
if (mySingleton01 == null) {
mySingleton01 = new Singleton01();
System.out.println("Singleton01被实例化了");
}
System.out.println("返回Singleton01实例");
return mySingleton01;
}
/**
* 上面方法就是常说了“懒汉式”做法,大体意思就是当谁需要类方法时采取实例化
*/
}
package singleton01;
public class TestMain {
public static void main(String[] args) {
// 打印出前两行结果
Singleton01 singleton01 = Singleton01.getInstance();
// 此时我们看到第二次调用类方法时候,没有去实例对象
// 这里涉及并发方面问题,暂时没学习并发,具体怎么个原理我也不知道...
Singleton01 singleton02 = Singleton01.getInstance();
}
}
效果图1
效果图2
之前的做法中我们用到了synchronized,就是为了防止线程启动的随机性找出变量混乱,我这个小例子可能看不出来什么。但实际上同步线程(synchronized)会使得程序效率大幅降低。利用双重检查加锁可以有效解决此问题,
使用双重检查加锁
package singleton01;
public class singleton02 {
// 利用双重检查加锁,先检查实例是否已经创建,如果没创建,就进行同步。
// volatile:instance变量被初始化singleton02实例时,多个线程会正确处理instance变量
// 线程是具有随机性的,与程序执行顺序无关。
private volatile static singleton02 instance=null;
public singleton02() {
}
public static singleton02 getInstance() {
if (instance == null) {
// 检查实例,不存在的话进入同步区域,只有第一次才执行这里
synchronized (singleton02.class) {
System.out.println("进入同步区域");
if (instance == null) {
System.out.println("instance被实例化了");
instance = new singleton02();
}
}
}
System.out.println("返回instance实例");
return instance;
}
}
package singleton01;
public class TestMain02 {
public static void main(String[] args) {
//第一次进入方法会进入同步区实例化
singleton02 singleton02 = null;
singleton02 = singleton02.getInstance();
//当第二次进入时,已有实例,不会同步了,直接返回实例.
singleton02 singleton03 = null;
singleton03 = singleton02.getInstance();
}
}
效果图
"饿汉式"做法
package singleton02;
public class Singleton {
/**
* “饿汉式”:加载这个类时立刻创建本类中唯一的单件实例,
*/
private static Singleton uniqueInstance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
System.out.println("返回实例实例");
return uniqueInstance;
}
}
package singleton02;
public class TestMain {
public static void main(String[] args) {
//直接返回实例
Singleton singleton = Singleton.getInstance();
}
}
效果图
注:双重检查加锁不适用与1.4之前的java版本。
要点:
1、单件模式确保程序中一个类最多只有一个实例。
2、单件模式提供这个实例的全局访问点。
3、实现单件模式,需要私有构造器,一个静态方法,一个静态变量。
4、设计到多线程问题,同步会降低程序效率。
感谢你看到这里,至此单件模式内容结束,本人文笔随便,若有不足或错误之处望给予指点,90度弯腰~~~很快我会发布下一个设计模式内容,生命不息,编程不止!
参考书籍:《Head First 设计模式》
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70259.html
摘要:简介单件模式也叫单例模式,是一种创建型模式。类图中类变量持有唯一的单件实例,是静态方法,可以通过类名在任何需要的地方使用它,与访问全局变量一样,但是可以延迟实例化。 1. 简介 单件模式(Singleton)也叫单例模式,是一种创建型模式。它确保一个类只有一个实例,并提供全局访问。 2. UML类图 showImg(https://segmentfault.com/img/bVb...
摘要:急切的創建對象饿汉式以上爲饿汉式單列設計,該設計是線程安全的,即不同的線程在調用時返回的是統一對象,在加載這個類時,馬上創建了這個類的唯一單列實列。 單件模式(JAVA實現) 定義 單件模式: 確保一個類只有一個實列, 並提供一個全局訪問點 單件模式和全局變量的區別 若將對象賦值給一個全局變量, 則該對象需在程序開始時就創建好, 而改對象可能不會使用, 造成資源浪費, 而單件模式支持...
摘要:命令模式的由来,其实是回调函数的一个面向对象的替代品,命令模式早已融入到了语言之中。 模式是对某情景下,针对某种问题的某种解决方案。而一个设计模式是用来解决一个经常出现的设计问题的经验方法。这么说来,每个模式都可能有着自己的意图,应用场景,使用方法和使用后果。本文的行文思路和目的皆在于了解各个模式的定义,应用场景和用实例说明如何在前端开发中使用。 本文所设计到的概念和实例大多来自《H...
阅读 3278·2021-10-13 09:39
阅读 2346·2021-09-02 15:15
阅读 2712·2019-08-30 15:54
阅读 1985·2019-08-30 14:01
阅读 2822·2019-08-29 14:13
阅读 1619·2019-08-29 13:10
阅读 2871·2019-08-28 18:15
阅读 4480·2019-08-26 10:20