Java-设计模式-单例模式-饿汉模式、懒汉模式
//-------------------------------------------------------------饿汉模式--开始-----------------------------------------------------------
package com.study.DesignPattern01;
/**
* 创建一个饿汉模式的单例
* @author ZLHome
*有些对象,我们只需要一个,如果多了,那么就可能导致数据不一致,
占用资源过多等等,比如:
配置文件、工具类、线程池、缓存、日志对象
*/
public class Singleton {
//1、构造方法私有化(这样类就不能被实例化了)
private Singleton(){
System.out.println("实例化Singleton类");
} //2、实例化单例对象,对象为静态的(这样就只会实例化一次),私有的(安全,外部不能直接Singleton.instance调用)
private static Singleton instance = new Singleton(); //3、提供一个静态方法(静态方法,类可以直接调用),用于获取单例
public static Singleton getInstance(){
return instance;
}
}
//---------------------------------------------------------------------------------------------
package com.study.DesignPattern01; import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test; public class SingletonTest { @BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("Junit开始BeforeClass...");
} @AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("Junit过后AfterClass...");
} @Before
public void setUp() throws Exception {
System.out.println("Junit开始Before...");
} @After
public void tearDown() throws Exception {
System.out.println("Junit过后After...");
} @Test
public void test() {
System.out.println("Junit开始...");
Singleton instance = Singleton.getInstance();
Singleton instance1 = Singleton.getInstance();
System.out.println("是否相等:"+(instance==instance1));
} }
//-------------------------------------------------------------饿汉模式--结束----------------------------------------------------------- //============================================================懒汉模式--开始============================================================
package com.study.DesignPattern01; public class Singleton1 {
//1、将构造方法设置为私有(这样类就不能被外部实例化了)
private Singleton1(){
System.out.println("实例化Singleton1");
} //2、申明单例对象
private static Singleton1 instance; //3、提供一个静态方法(静态方法属于类),用于外部调用
public static Singleton1 getInstance(){
if(instance==null){
System.out.println("第一次实例化Singleton1对象");
instance=new Singleton1();
}
return instance;
}
} //============================================================ package com.study.DesignPattern01; import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test; public class Singleton1Test { @BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("Junit开始BeforeClass...");
} @AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("Junit过后AfterClass...");
} @Before
public void setUp() throws Exception {
System.out.println("Junit开始Before...");
} @After
public void tearDown() throws Exception {
System.out.println("Junit过后After...");
} @Test
public void test() {
System.out.println("Junit开始...");
Singleton1 instance = Singleton1.getInstance();
Singleton1 instance1 = Singleton1.getInstance();
System.out.println("是否相等:"+(instance==instance1));
} } //============================================================懒汉模式--结束============================================================
设计模式
可靠性更高、更容易理解、扩展性更好‘更容易维护
1、单例模式:
1)单例背景、情况:
有些对象,我们只需要一个,如果多了,那么就可能导致数据不一致,
占用资源过多等等,比如:
配置文件、工具类、线程池、缓存、日志对象
2)原理:
实例化对象是通过构造方法来实现的(程序类未写,则程序类有默认的构造方法),
单例只允许获取一个实例,所以
饿汉模式:
类加载的时候就实例化对象(比较饿,主动实例对象)
(1)实现单例就去改写构造方法:将构造方法改写为私有的,改写之后,就不能直接实例化了(不允许外部直接创建实例)
(2)创建类的唯一实例(类里面去new一个实例,且这个实例是static[变量、方法加static后就变成类所有,不是必须创建实例对象来调用],这样就可以通过类直接调用这个实例[类名.实例变量名])
(3)为了安全,不允许外部直接访问成员变量,所以(2)需要优化,将类的static实例变为private,变为private之后就不能直接通过"类名.实例变量名"来访问了,所以提供类的方法get,类的get方法也需要是static才能通过"类名.方法名"调用
懒汉模式:
类加载的时候只是声明一下,调用这个单例的时候才实例化(比较懒,不主动去实例对象)
(1)先声明一个单例,并不实例化单例对象
(2)在get方法里面去判断,如果没有实例这个对象,就将单例对象实例化再返回
对比:
懒汉模式:类加载快,获取对象慢,线程安全的
饿汉模式:类加载慢,获取对象快,线程不安全
总结:static修饰的变量、方法数据类,可以通过类直接调用
Java-设计模式-单例模式-饿汉模式、懒汉模式的更多相关文章
- 瞎扯设计模式1:单例模式 饿汉模式 懒汉模式 线程安全的单例 singleton 设计模式 java
[原创声明]此文为本人原创,欢迎转载,转载请注明出处,作者链接~ http://www.cnblogs.com/m-yb/p/8833085.html 单例很常用,面试也经常被问,如:不用自定义锁怎么 ...
- Java设计模式 - 单例模式 (懒汉方式和饿汉方式)
概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...
- Java设计模式 - - 单例模式 装饰者模式
Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...
- java设计模式单例模式 ----懒汉式与饿汉式的区别
常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...
- Singleton模式(单例模式) 饿汉式和懒汉式
目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例. 好比一个国家就只有一个皇帝(XXX),此时每个人叫的“皇帝”都是指叫的XXX本人; 常见单例模式类型: 饿汉式单例:直接将对 ...
- Java 单例设计模式之 饿汉式和懒汉式
public class InstanceSampleTest { public static void main(String[] args) { /** 单例设计模式的 饿汉式和懒汉式 * 单例模 ...
- 单例设计模式Singleton之懒加载模式(懒汉模式)【原】
单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...
- Java中单例设计模式,饿汉式和懒汉式
Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
随机推荐
- Java Web 错误排查
排查404 1. 检查web.xml,有没有放在web-inf下面,再检查过滤器有没有配置 <filter> <filter-name>struts</filter-na ...
- 【转】php缓冲 output_buffering和ob_start
原文: http://blog.csdn.net/21aspnet/article/details/7389427 php缓冲 output_buffering和ob_start buffer buf ...
- Android----ListView入门知识--各种Adapter配合使用
引自:http://www.cnblogs.com/playing/archive/2011/03/21/1990555.html 在android开发中ListView是比较常用的组件,它以列表的形 ...
- app每个页面都有一个相同的浮层控件 实现思路
可以创建一个window,设置其windowLevel为alert;
- Windows Embedded CE 6.0 下载地址和序列号
Windows Embedded CE 6.0 下载地址和序列号 安装起来特麻烦 程序下载地址 http://download.microsoft.com/download/a/0/9/a09e587 ...
- android屏幕适配方法
android中图片适配是一件很棘手的事情,本篇文章详细的介绍屏幕显示的原理,为什么会资源文件中会存在 drawable-ldpi.drawable-mdpi.drawable-hdpi.drawab ...
- copy ,abs,includes 3个函数
copy: Copy函数原型:标头: <algorithm> OutputIterator copy( InputIterator begin, InputIterator end, o ...
- boost库使用说明
1 下载安装 2 编译的时候,需要添加头文件和链接对应的库
- javascript技巧大全套
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcE ...
- Xcode 6配置里定义${ARCHS_STANDARD}为armv7, arm64以及错误
转发:http://www.cocoachina.com/ios/20141013/9897.html 最近一次的Xcode 6更新默认不再支持arm7s架构,究竟是要废除不用呢还是仅仅只是一个疏忽? ...