网站首页 > java教程 正文
GoF 23种设计模式的分类表:

定义及场景:
保证一个类只能生成一个实例,并且提供一个访问该实例的全局访问点。
例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、Spring中Bean、Servlet等常常被设计成单例。
优点:
由于单例模式只生成一个实例,减少了系统性能的开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留在内存中的方式来解决。
单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
常见单例模式实现方式:
饿汉式(线程安全,调用效率高。不能延时加载)
//问题:如只加载本类,而不需要调用getInstance(),则造成资源浪费。
public class SingletonTest
{
//类初始化时,立即加载这个对象(没有延时加载的优势)
//静态变量加载是天然的线程安全
private static SingletonTest singletonTest = new SingletonTest();
//构造器私有化
private SingletonTest() {
}
//定义一个全局的访问点,访问这个单例对象,方法没有同步,调用效率高
public static SingletonTest getInstance(){
return singletonTest;
}
}
懒汉式(线程安全,调用效率不高。可延时加载。单线程可以去掉同步块来提高效率)
//问题:每次调用getInstance()方法都要同步,并发效率较低。
public class SingletonTest
{
//类初始化时,不会立即加载这个对象,用到时再创建
private static SingletonTest singletonTest;
//构造器私有化
private SingletonTest(){
}
//方法同步,调用效率较低
public static synchronized SingletonTest getInstance(){
if(singletonTest == null){
singletonTest = new SingletonTest();
}
return singletonTest;
}
}
双重检测锁式(使用较少)
//问题:同样功能下,代码量最大。
public class SingletonTest
{
private static SingletonTest singletonTest = null;
private SingletonTest(){
}
public static SingletonTest getInstance(){
if(singletonTest == null){
SingletonTest st;
//只有第一次实例化才需要同步,提高了执行效率
synchronized (SingletonTest.class){
st = singletonTest;
if(st == null){
synchronized(SingletonTest.class) {
st = new SingletonTest();
}
}
singletonTest = st;
}
}
return singletonTest;
}
}
静态内部类式(线程安全,调用效率高。可以延时加载)
//外部类没有static属性,不会立即加载对象。兼备了并发高效调用和延时加载的优势
public class SingletonTest
{
private SingletonTest(){
}
//singletonTest是staticfinal类型,保证了内存中只有一个这样的实例存在,而且只能被赋值一次,从而保证了线程安全性
private static class SingletonClassInatance{
private static final SingletonTest singletonTest = new SingletonTest();
}
//只有真正调用getInstance(),才会加载静态内部类。加载类时是线程安全的。
public static singletonTest getInstance(){
return SingletonClassInatance.singletonTest;
}
}
枚举单例(线程安全,调用效率高,不能延时加载)
//枚举式单例模式实现(没有延时加载)
public enum SingletonTest
{
//定义一个枚举元素,它本身就代表了SingletonTest的一个单例
INSTANCE;
//添加自己需要的操作!
public void singletonOperation(){
}
}
用单例,选哪个?
延时加载中,静态内部类式效率优于懒汉式。
不需要延时加载中,枚举式效率优于饿汉式。
免费分享Java技术资料,需要的朋友可以先关注后私信我,免费获取
原文:https://mp.weixin.qq.com/s/m9ZVuKvn6RrtmD4EMo5hpA作者:专注一行代码来源:微信公众号
猜你喜欢
- 2024-09-22 带你了解单例模式(Singleton Pattern)的五种写法!
- 2024-09-22 单例模式的常用写法(单例模式三种写法)
- 2024-09-22 设计模式之-单例模式(单例设计模式的作用)
- 2024-09-22 Java(面试)——单例模式(java中单例模式的实现)
- 2024-09-22 在Java中实现单例模式(java单例模式实现方式)
- 2024-09-22 Java单例模式(java单例模式双重检查)
- 2024-09-22 Java设计模式之单例模式解析(java 单例模式 例子)
- 2024-09-22 本文将给大家介绍java中设计模式——单例模式
- 2024-09-22 java面试:单例模式,一篇就够了(java单例模式写法)
- 2024-09-22 Java设计模式(十八):单例模式(java的单例设计模式)
欢迎 你 发表评论:
- 12-02win7电脑恢复出厂(win7电脑恢复出厂设置怎么操作的)
- 12-02快手极速版下载app(11快手极速版下载安装)
- 12-02压缩文件损坏怎么修复(压缩文件损坏怎么修复后无法打开)
- 12-02戴尔服务器售后电话(dell 服务器售后电话)
- 12-02win10系统备份还原(win10系统备份还原方法)
- 12-02电脑怎么测试麦克风有没有声音
- 12-02台式电脑usb接口无法识别设备
- 12-02melogincn登录密码(melogincn登入密码)
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)

本文暂时没有评论,来添加一个吧(●'◡'●)