单例模式
最初对一些设计模式感觉遥不可及,一直不敢直接去接触设计模式,就让自己对一些程序设计方面逐渐暴露出很多的缺点,在最近的项目开发过程中也逐渐认识到,程序设计的重要性。
于是今天开始攻破一些设计模式,从最简单的入门,先开始单例模式,先举一些日常用到单例的场景
- Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗?
不信你自己试试看哦~- windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
- 网站的计数器,一般也是采用单例模式实现,否则难以同步。
- 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
- Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
- 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
- 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
- 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
- HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例.
所以,单例模式就是说这个对象只存在一个,下面我们来看一下代码说明的案例:
实现单例模式的类
package io.jason.easy.start.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* @ClassName LoadServer
* @Description
* @Author Jason
* @Date 2019-07-09 14:16
**/
public class LoadServer {
private static LoadServer loadServer = null;
private static int i = 0;
private List<String> serverList = null;
private LoadServer() {
serverList = new ArrayList<String>();
}
static {
System.out.println("类已加载。。。。");
System.out.println("class==\t"+loadServer);
}
public static LoadServer getInstance(){
System.out.println("class==\t"+loadServer);
if(loadServer == null){
loadServer = new LoadServer();
}
return loadServer;
}
public void addServer(String server){
serverList.add(server);
}
public void removeServer(String server){
serverList.remove(server);
}
public String getServer(){
Random random = new Random();
// 获取随机数(在serverList长度范围内)
int i = random.nextInt(serverList.size());
return serverList.get(i);
}
}
调用单例证明只存在一个对象
package io.jason.easy.start.api;
import io.jason.easy.start.util.LoadServer;
/**
* @ClassName SingletonAPI
* @Description
* @Author Jason
* @Date 2019-07-09 14:13
**/
public class SingletonAPI {
public static void main(String[] args) {
// 创建对象
LoadServer server1 = LoadServer.getInstance();
LoadServer server2 = LoadServer.getInstance();
LoadServer server3 = LoadServer.getInstance();
// 输出对象所对应的hashcode是否都相同
System.out.println((server1 == server2)+"\t\t"+(server2 == server3));
System.out.println("server1=\t"+server1);
System.out.println("server2=\t"+server2);
System.out.println("server3=\t"+server3);
server1 .addServer("server1");
server2.addServer("server2");
server3.addServer("server3");
for (int i = 0; i < 5; i++) {
System.out.println(server1.getServer());
}
}
}
这段代码中,声明了三个对象的实例,分别对这三个对象进行操作,证明最终操作的是否是同一个对象,下面是运行出来的结果:
true true
server1= io.jason.easy.start.util.LoadServer@3af49f1c
server2= io.jason.easy.start.util.LoadServer@3af49f1c
server3= io.jason.easy.start.util.LoadServer@3af49f1c
server1
server1
server1
server3
server3
最终控制台输出的三个实例,打印出的对象所对应的hashcode都是相同的(【@3af49f1c】@后面的)以及对其中的一个实例进行循环输出该实例中的集合对象,都是通过另外两个实例操作的,说明这三个实例其实都是同一个对象。
以上总结:个人感觉对设计模式的初步认知为就是对程序设计的思想,在项目开发过程中,代码的好坏并不是运用了多少的设计模式,而是对程序设计的逻辑思想,面向对象的设计原则是否遵循,只是设计模式能更好让你认知对程序设计的思考。
个人还只是菜鸟,只是想留一些笔记对自己的以后回头总计做一些参考,毕竟程序设计路漫漫,而自己学识尚浅,不积跬步无以至千里。
以后坚持每天一个设计模式,学习之后善于总结。
”我要一步一步往上爬
在最高点乘着叶片往前飞“
– 杰伦《蜗牛》