Java学习笔记(二十四):单例设计模式singleton

为什么要使用singleton设计模式?

假设设计了一个操作数组的工具类(Tools),里面有一个锤子的方法(Hammer),如果不使用singleton设计模式,每次想调用Hammer方法都需要new一个Tools类出来

 1 class Tools{
 2     //锤子
 3     public void Hammer(){
 4         System.out.println("使用锤子");
 5     }
 6 }
 7
 8 public class ToolsDemo {
 9     public static void main(String[] args){
10     //需要使用锤子
11     new Tools().Hammer();
12     //需要使用锤子
13     new Tools().Hammer();
14     //需要使用锤子
15     new Tools().Hammer();
16     }
17 }    

运行结果

使用锤子
使用锤子
使用锤子

这样很浪费内存资源,就像一个班级的人吃核桃需要用锤子砸,没必要为每个学生买一个锤子,只需买一个锤子,谁要吃核桃谁就去用锤子,大大节省了成本。

于是就引出了singleton单例设计模式,只需要在内存中生成一次,以后想用只需调用这块内存即可,没必要每次都要重新在堆中new一个Tools类

 1 class Tools{
 2     //(1):必须在该类中,自己先创建出一个静态对象
 3     private static Tools instance = new Tools();
 4     //(2):私有化自身的构造器,防止外界通过构造器创建新的对象
 5     private Tools(){}
 6     //(3):额外暴露一个公共的静态方法用于获取自身的对象
 7     public static Tools getInstance() {
 8         return instance;
 9     }
10
11     //锤子
12     public void Hammer(){
13         System.out.println("使用锤子");
14     }
15 }
16
17 public class ToolsDemo {
18     public static void main(String[] args){
19         //需要使用锤子
20         Tools.getInstance().Hammer();
21         //需要使用锤子
22         Tools.getInstance().Hammer();
23         //需要使用锤子
24         Tools.getInstance().Hammer();
25     }
26 }

运行结果

使用锤子
使用锤子
使用锤子
时间: 2024-10-08 05:01:07

Java学习笔记(二十四):单例设计模式singleton的相关文章

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

angular学习笔记(二十四)-$http(2)-设置http请求头

1. angular默认的请求头: 其中,Accept 和 X-Requested-With是$http自带的默认配置 2. 修改默认请求头: (1) 全局修改(整个模块) 使用$httpProvider依赖 var myApp = angular.module('MyApp',[]); myApp.config(function($httpProvider){ console.log($httpProvider.defaults.headers.common) //修改/操作$httpProv

(转)【D3D11游戏编程】学习笔记二十四:切线空间(Tangent Space)

(注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 切换空间,同局部空间.世界空间等一样,是3D图形学中众多的坐标系之一.切换空间最重要的用途之一,即法线映射(Normal Mapping).关于法线映射的细节,将在下一篇文章中详细介绍.但在学习法线映射之前,深刻地理解切换空间非常重要.因此借这一篇文章来学习下它,以为后面学习法线映射.视差映射(Parallax Mapping).Dis

Java基础学习笔记二十四 MySQL安装图解

.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Complete(完全)”.“Custom(用户自定义)”三个选项,选择“Custom”,按“next”键继续. 3.点选“Browse”,手动指定安装目录. 4.填上安装目录,我的是“F:\Server\MySQL\MySQL Server 5.0”,也建议不要放在与操作系统同一分区,这样可以防止系统备份还

Java学习系列(二十四)Java正则表达式详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45501777 前言 正则表达式可以说是用来处理字符串的一把利器,它是一个专门匹配n个字符串的字符串模板,本质是查找和替换.在实例演示之前先了解一下Pattern.Matcher这两个工具类,Pattern:编译好的带匹配的模板(如:Pattern.compile("[a-z]{2}");/ / 取2个小写字母):Matcher:匹配目标字符串后产生的结果(如:pattern.m

Android学习笔记二十四.Service入门(二)绑定本地Service并与之通信

绑定本地Service并与之通信    通过上一篇博文的前3步,我们就算完成了一个Service及使用该Service的应用程序(Service为该应用程序的组成部分).但当程序通过startService()和stopService()启动.关闭Service时,Service与访问者之间基本上不存在太多的关联,因此Service和访问者之间也无法进行通信.数据交换.如果我们希望开发的Service能与访问者之间实现方法调用或数据交换,我们可以让访问者使用bindService()和unbin

java学习笔记(十四)

一.散列表 1.容量:散列表中的散列数组大小 2.散列运算:key->散列值的算法 3.散列桶:散列值相同的元素的"线性集合" 4.加载因子:就是散列数组加载率,就是元素数量/散列数组大小 5.散列查找:根据key计算散列值,找到散列桶,在散列桶中顺序比较key,如果一样就返回value 6.散列表中key不同,value可以重复 例子: <span style="white-space:pre"> </span>User u1=new

[傅里叶变换及其应用学习笔记] 二十四. 级联,脉冲响应

我们上节课学习了 在离散有限维空间中,任何线性系统都是通过矩阵间的相乘得到的 在连续无限维空间中,任何线性系统都是通过对核函数的积分得到的 脉冲响应(impulse response) 级联线性系统(Cascading linear system) 如果$L$与$M$都是线性的,有 $w=MLv$ 在连续无限维空间中 $\begin{align*}MLv&=M\left( \int_{-\infty}^{\infty}k(x,y)v(y)dy \right )\\&\approx M\le

JAVA学习笔记(三十四)- 字节打印流 PrintStream

PrintStream字节打印流 import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.Reader; /* * Pri