Java设计模式之单例模式
很多人都疑惑,单例模式是什么?为什么要用单例模式?在这里,笔者记录的仅仅只是自己对于知识点的理解,如果有错误的,请下方评论指教,共同进步,谢谢。
单例模式是什么?
简单理解: 单例就是一个实例被多个用户共享,好比宿舍共用同一个垃圾桶,这个垃圾桶就是单个实例,现实生活中不可能每个人都配一个垃圾桶什么的,那样太浪费资源了吧。
官方理解:对象的创建模式,确保某一个类只有一个实例,并且能够自动实例化且向整个应用程序提供这个实例。单例模式的核心在于通过一个接口返回唯一的对象实例;首要的问题就是要把创建实例的权限收回来,让类自身来负责自己类的实例的创建工作,然后由这个类来提供外部可以访问这个类实例的方法
单例模式的特点:
1、单例类只能有一个实例
2、单例类必须自己创建自己的实例(无法从外部创建,创建的时候将构造函数设置为私有的)
3、单例类必须向所有对象提供自己的实例
单例模式的优点:
1、在内存中只有一个对象,节省内存空间
2、避免频繁的创建销毁对象,提高性能
3、避免对共享资源的占用,可以全局访问
单例模式的类型:
1、饿汉单例(自动创建实例)
2、懒汉单例(调用的时候才创建实例)
3、登记式单例(这个我还没理解)
一、饿汉单例
//饿汉式单例,在类初始化的时候,已经自己实例化了
public class mvc {
private static mvc instance = new mvc();
private mvc() {
}
public static mvc getInstance(){
return instance;
}
}
饿汉在类创建的同时就已经创建好一个静态的对象供使用了,线程是安全的
二、懒汉单例
//懒汉单例,在第一次调用的时候实例化自己
public class mvc1 {
private static mvc1 instance = null;
private String name;
private mvc1(){}
//静态工厂方法
synchronized public static mvc1 getInstance(){
if(instance==null){
instance = new mvc1();
}
return instance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printinfo(){
System.out.println("this name is "+name);
}
}
测试代码
//定义测试类
public class testmvc1 {
public static void main(String[] args) {
mvc1 m2 = mvc1.getInstance();
m2.setName("0539");
mvc1 m1 = mvc1.getInstance();
m1.setName("json");
m1.printinfo();
m2.printinfo();
System.out.println(m1==m2?"创建的是同一个实例":"创建的不是同一个实例");
}
}
结果
this name is json
this name is json
创建的是同一个实例
测试结果说明:实例化,结果往往是最后一个的实例。也就是说,单例模式,不管是饿汉还是懒汉,创建的都是同一个实例。
mvc1类必须要有一个 private 访问级别的构造函数,只有这样,才能确保单例不会在系统中的其他代码内被实例化,同时,在外部的话只能通过getInstance()方法去调用;
其次,instance 成员变量和 getInstance 方法必须是 static 的。
懒汉单例下是没有考虑线程安全问题的,所以要用synchronized加同步 饿汉和懒汉的区别:
1、饿汉自动实例化,懒汉要调用它才实例化
2、饿汉不用考虑线程安全问题,懒汉需要考虑线程安全问题
什么是线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题,那就是线程安全的。
总结:
1、单例模式的作用是用来创建单个实例,并且这个实例这整个应用程序共享
2、单例模式的类型有三种:饿汉单例,懒汉单例,登记式单例
其中饿汉自动创建实例,并保证线程安全;懒汉被动创建实例,不能保证线程安全的问题。
3、单例模式的优点:但同一个对象被多次实例,会占用大量资源,减少性能;通过采用单例,那么每次都是调用同一个实例,会提高性能。好比喝水,不可能每次都用一次性杯子。
Java设计模式之单例模式的更多相关文章
- java 设计模式之单例模式
-------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...
- 折腾Java设计模式之单例模式
博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...
- Java 设计模式之单例模式(一)
原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...
- java设计模式1——单例模式
java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...
- java设计模式之单例模式你真的会了吗?(懒汉式篇)
java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- java设计模式- (1)单例模式
参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...
- [转]JAVA设计模式之单例模式
原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...
- java设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
随机推荐
- NodeJS中 package.json各属性分析
package.json 中包含各种所需模块以及项目的配置信息(名称.版本.许可证等)meta 信息. Name:它属于必须字段,在package.json中最重要的就是name和version字段, ...
- 导入一些常用命令比如(rz),关闭防火墙外面可以访问
yum -y install lrzsz-----------导入常用命令 我在虚拟机上面启动了一个项目 这个原因是防火墙造成的,关闭防火墙 iptables -L 查看下 service ipt ...
- mfc的OnInitDialog的返回值
以前从未注意过初始化函数的返回值,今天看到书中所述,以后可能用得上. OnInitDialog的返回值告诉windows如何处置输入焦点,如果返回 TRUE,则windows将输入焦点指派给制表键控制 ...
- Maven Plugins常用配置
官方文档:http://maven.apache.org/plugins/index.html# 这里主要介绍compiler插件的配置.http://maven.apache.org/plugins ...
- Distributed4:SQL Server 分布式数据库性能测试
我使用三台SQL Server 2012 搭建分布式数据库,将一年的1.4亿条数据大致均匀存储在这三台Server中,每台Server 存储4个月的数据,Physical Server的配置基本相同, ...
- error: failed to push some refs to '......'解决方案
由于是初学者,又因为最近项目需要,只好边学边用吧. 在使用 “git push origin master” 时出现了以下问题 网上搜到的解决方案,可用: 先输入: git stash(用于暂存当前 ...
- 利用Shell脚本将MySQL表中的数据转化为json格式
脚本如下: #!/bin/bash mysql -s -phello test >.log <<EOF desc t1; EOF lines="concat_ws(',', ...
- T-Sql(二)事务(Transaction)
今天讲下T-Sql语法中事务的用法,事务在项目中一般用的很少,主要用于转账,或是一些多表操作,第一步完成不了滚回,不执行接下的步骤.要么都不完成要么都完成,这是事务的特征. 语法很简单,示例代码如下: ...
- 异步Promise实现
简介 异步回调的书写往往打乱了正常流的书写方式,在ECMAScript 6中实现了标准的Promise API,旨在 解决控制回调流程的问题. 简单的实现了Promise API: (function ...
- 总结Oracle删除表空间遇到的问题
问题1:删除表空间期间遭遇报错 ORA-29857 问题2:删除表空间期间遭遇 ORA-02429 问题3:表空间删除完毕,主机磁盘空间不释放 问题1:删除表空间期间遭遇报错 ORA-29857 删除 ...