//-------------------------------------------------------------饿汉模式--开始-----------------------------------------------------------
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. 瞎扯设计模式1:单例模式 饿汉模式 懒汉模式 线程安全的单例 singleton 设计模式 java

    [原创声明]此文为本人原创,欢迎转载,转载请注明出处,作者链接~ http://www.cnblogs.com/m-yb/p/8833085.html 单例很常用,面试也经常被问,如:不用自定义锁怎么 ...

  2. Java设计模式 - 单例模式 (懒汉方式和饿汉方式)

    概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...

  3. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  4. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  5. Singleton模式(单例模式) 饿汉式和懒汉式

    目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例. 好比一个国家就只有一个皇帝(XXX),此时每个人叫的“皇帝”都是指叫的XXX本人; 常见单例模式类型: 饿汉式单例:直接将对 ...

  6. Java 单例设计模式之 饿汉式和懒汉式

    public class InstanceSampleTest { public static void main(String[] args) { /** 单例设计模式的 饿汉式和懒汉式 * 单例模 ...

  7. 单例设计模式Singleton之懒加载模式(懒汉模式)【原】

    单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...

  8. Java中单例设计模式,饿汉式和懒汉式

    Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...

  9. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  10. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

随机推荐

  1. HDU 2671 Can't be easier

    简单的几何题目 点(a,b)关于直线Ax+By+C=1对称点的公式 #include<cstdio> #include<cstring> #include<cmath&g ...

  2. zencart url特殊字符处理

    1. 支持 在后台的seo url 将Outputw3c 改为false 2.删除特殊字符 这对于在少量的zen cart网站上处理少量的特殊字符可能还适用,实际上我们经常在导入产品数据时或者或少会带 ...

  3. P图

    照片名称:调出照片柔和的蓝黄色-简单方法,1.打开原图素材,按Ctrl + J把背景图层复制一层,点通道面板,选择蓝色通道,图像 > 应用图像,图层为背景,混合为正片叠底,不透明度50%,反相打 ...

  4. Angular服务器通信之:$http

    $http服务提供了浏览器XMLHttpRequest对象的封装,并且作为Angular中和后台服务通信的底层服务,在此之上Angular还提供了一个可选模块ngResource支持与RESTFul的 ...

  5. activity管理类 appManager

    程序启动第一个界面类: net.oschina.app.AppStart功能描述:一张图片代码细节描述:一个透明度的动画效果,效果动画完成后自动启动新的Activity(Main) 基本BaseAct ...

  6. Spring + iBATIS完整示例

    最近研究了一下Spring + iBATIS.发现看别人的例子是一回事,自己写一个完整的应用又是另外一回事.自己受够了网上贴的一知半解的代码. iBATIS是一个持久化框架,封面了sql过程,虽然sq ...

  7. 风格一致的backItem在项目中怎样设置

    在相应的navigationController中重写- (void)pushViewController:(UIViewController *)viewController animated:(B ...

  8. dyld: Symbol not found: _OBJC_CLASS_$_UIBlurEffect

    信息如下: 不知道为撒出现这个问题,查资料也木有查到..看提示信息可能是UIKit的问题,所以就试着这样解决,结果居然好了....有谁知道原因的告诉额一声啊,拜托!

  9. 强制设置IE浏览器的版本模式

    转载自:http://blog.csdn.net/huwenhu2007/article/details/17954119 1.<meta http-equiv="X-UA-Compa ...

  10. 1209:Catch That Cow(bfs)

    题意: 从一个坐标到另一个坐标的移动方式有三种,即:st-1,st+1,2*st.每移动一步时间是一秒. 给出两个坐标,求得从第一坐标到第二座标的最短时间. #include<iostream& ...