博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《设计模式之禅》读书笔记--(2)单例模式
阅读量:4299 次
发布时间:2019-05-27

本文共 1491 字,大约阅读时间需要 4 分钟。

定义

单例模式要求一个类只能生成一个对象。开发者可以通过定义一个私有访问权限的构造函数,来避免被其他类new出一个对象,其他类对该类的访问可以通过getInstance获得同一个对象。

类图

这里写图片描述

实现

单例模式根据申请对象的时机可分为饿汉式单例与懒汉式单例,其中,饿汉式单例在程序启动就申请对象;懒汉式单例在其他类获取单例时申请对象。需要注意的是,懒汉式单例还需要考虑多线程同时调用getInstance方法的影响。

饿汉式单例:

package com.sigalhu.singleton;public class Singleton {
private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singleton(){} //通过该方法获得实例对象 public static Singleton getSingleton(){ return singleton; } //类中其他方法,尽量是static public static void daSomething(){ }}

线程不安全的懒汉式单例:

package com.sigalhu.singleton;public class Singleton {
private static Singleton singleton = null; //限制产生多个对象 private Singleton(){} //通过该方法获得实例对象 public static Singleton getSingleton(){ if(singleton == null){ singleton = new Singleton(); } return singleton; }}

线程安全的懒汉式单例:

package com.sigalhu.singleton;public class Singleton {
private static Singleton singleton = null; //限制产生多个对象 private Singleton(){} //通过该方法获得实例对象 public static Singleton getSingleton(){ if(singleton == null){ synchronized (Singleton.class){ if(singleton == null){ singleton = new Singleton(); } } } return singleton; }}

优点

  • 内存中只有一个实例,减少了内存开支;
  • 只生成一个实例,减少了系统的性能开销;
  • 可以避免对资源的多重占用;
  • 可以在系统设置全局的访问点,优化和共享资源访问。

缺点

  • 单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现;
  • 若单例模式没有完成,是不能进行测试的,没有接口也不能使用mock的方法虚拟一个对象;
  • 单例模式与单一职责原则冲突。

源码:

你可能感兴趣的文章
mysql查询某一个字段是否包含中文字符
查看>>
Java中equals和==的区别
查看>>
JVM内存管理及GC机制
查看>>
Java:按值传递还是按引用传递详细解说
查看>>
全面理解Java内存模型
查看>>
Java中Synchronized的用法
查看>>
阻塞队列
查看>>
linux的基础知识
查看>>
接口技术原理
查看>>
五大串口的基本原理
查看>>
PCB设计技巧与注意事项
查看>>
linux进程之间通讯常用信号
查看>>
main函数带参数
查看>>
PCB布线技巧
查看>>
关于PCB设计中过孔能否打在焊盘上的两种观点
查看>>
PCB反推理念
查看>>
京东技术架构(一)构建亿级前端读服务
查看>>
git 提示:error: unable to rewind rpc post data - try increasing http.postBuffer
查看>>
php 解决json_encode中文UNICODE转码问题
查看>>
LNMP 安装 thinkcmf提示404not found
查看>>