Android(java)学习笔记78:设计模式之单例模式
单例模式代码示例:
1. 单例模式之饿汉式:
 package cn.itcast_03;
 public class Student {
     // 构造私有
     private Student() {
     }
     // 自己造一个
     // 静态方法只能访问静态成员变量,加静态
     // 为了不让外界直接访问修改这个值,加private
     private static Student s = new Student();
     // 提供公共的访问方式
     // 为了保证外界能够直接使用该方法,加静态,不加static,外界就必须创建一个对象,显然这里是不容许的
     public static Student getStudent() {
         return s;//这里是原子性操作,不是多条语句操作共享数据,所以开发的时候,我们用饿汉式,会比较安全(开发时候会常涉及到多线程)
     }
 }
测试类:
package cn.itcast_03; /*
* 单例模式:保证类在内存中只有一个对象。
*
* 如何保证类在内存中只有一个对象呢?
* A:把构造方法私有
* B: 在成员位置自己创建一个对象
* C: 通过一个公共的方法提供访问
*/
public class StudentDemo {
public static void main(String[] args) {
// Student s1 = new Student();
// Student s2 = new Student();
// System.out.println(s1 == s2); // false // 通过单例如何得到对象呢? // Student.s = null; Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
System.out.println(s1 == s2); System.out.println(s1); // null,cn.itcast_03.Student@175078b
System.out.println(s2);// null,cn.itcast_03.Student@175078b
}
}
2. 单例模式之懒汉式:
package cn.itcast_03; /*
* 单例模式:
* 饿汉式:类一加载就创建对象
* 懒汉式:用的时候,才去创建对象
*
* 面试题:单例模式的思想是什么?请写一个代码体现。
*
* 开发:饿汉式(是不会出问题的单例模式)
* 面试:懒汉式(可能会出问题的单例模式)
* A:懒加载(延迟加载)
* B:线程安全问题
* a:是否多线程环境 是
* b:是否有共享数据 是
* c:是否有多条语句操作共享数据 是
*/
public class Teacher {
private Teacher() {
} private static Teacher t = null; public synchronized static Teacher getTeacher() {
// t1,t2,t3
26 if (t == null) {//多条语句操作共享数据
27 //t1,t2,t3
t = new Teacher();
29 }
return t;
}
}
测试类:
 package cn.itcast_03;
 public class TeacherDemo {
     public static void main(String[] args) {
         Teacher t1 = Teacher.getTeacher();
         Teacher t2 = Teacher.getTeacher();
         System.out.println(t1 == t2);
         System.out.println(t1); // cn.itcast_03.Teacher@175078b
         System.out.println(t2);// cn.itcast_03.Teacher@175078b
     }
 }
3. 单例模式之双重锁定:
思路很简单,就是我们只需要同步(synchronize)初始化instance的那部分代码从而使代码既正确又很有效率。 这就是所谓的“双检锁”机制(顾名思义)。
 public class Singleton{
   private static Singleton single;    //声明静态的单例对象的变量
   private Singleton(){}    //私有构造方法   
   public static Singleton getSingle(){    //外部通过此方法可以获取对象
     if(single == null){           // Single Checked
         synchronized (Singleton.class) {   //保证了同一时间只能只能有一个对象访问此同步块
             if(single == null){   // Double Checked
                 single = new Singleton();
         }
       }
     }
     return single;   //返回创建好的对象
   }
 }  
Android(java)学习笔记78:设计模式之单例模式的更多相关文章
- java学习面向对象之设计模式之单例模式
		就像上一节当中我们讲到的数组工具集一样,如果我们把他看作一个类,来应用,不阻止他new函数的话,这个类我们在整个过程当中我们只是用他来当一个工具.假如每次用都要new一下产生一个新对象的话,就会显得整 ... 
- JAVA学习笔记--策略设计模式与适配器模式
		一.策略设计模式 创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式:这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分.策略就是传递进去的参数对象,它包含要执行 ... 
- Java学习笔记4
		Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ... 
- 《Java学习笔记(第8版)》学习指导
		<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ... 
- java学习笔记之基础篇
		java选择语句之switch //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ... 
- Java学习笔记(04)
		Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ... 
- 0028 Java学习笔记-面向对象-Lambda表达式
		匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ... 
- Android动画学习笔记-Android Animation
		Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ... 
- Java学习笔记:语言基础
		Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ... 
- Java学习笔记——动态代理
		所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ... 
随机推荐
- MFC工程目录
			如果已经以Debug方式编译链接过程序,则会在解决方案文件夹下和工程子文件夹下各有一个名为“Debug”的文件夹,而如果是Release方式编译则会有名为“Release”的文件夹.这两种编译方式将产 ... 
- jQuery/CSS3大屏下拉菜单 自定义子菜单内容
			这是一款样式很酷的jQuery/CSS3下拉菜单,首先这款CSS3菜单是宽屏的,主要是下拉菜单非常大气,更重要的是,下拉菜单的内容可以自己定义,也就是说,下拉菜单中可以定义菜单.图片等HTML元素,是 ... 
- CSS基础(背景、文本、列表、表格、轮廓)
			CSS 背景属性 属性 描述 background 简写属性,作用是将背景属性设置在一个声明中. background-attachment 背景图像是否固定或者随着页面的其余部分滚动. backgr ... 
- mysql注册服务
			http://www.2cto.com/database/201301/185456.html ____________________________________________________ ... 
- 应用反射写的tostring方法
			应用反射写的tostring方法 应用反射写的tostring方法,方便以后查询 代码 package com.chzhao.reflecttest; import java.lang.reflect ... 
- Chrome的Postman的使用
			Chrome提供了一个很好的Web App 名为 Postman 使用这个web app,你可以输入一个url,然后可以很清楚的看到返回的各种结果 直接在Google中输入Postman, 找到它 ... 
- bat定时执行,清除PHP缓存
			bat中需要设置一个等待时间,执行完一条命令后,等待30分钟后在执行第二条命令,请问怎么做?急急急----谢谢大家 @echo off& echo wscript.sleep wscript. ... 
- 比较器comparable与comparator的使用
			在Java学习和使用里,工具类与算法类(collections和Arrays)也是我们使用比较多的,在它们里面就包含了comparable与comparator这两种比较器. 一.比较器的分类与概念 ... 
- 《JavaScript高级程序设计》 读书笔记(二)
			数据类型 ECMAScript 中有 5 种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number和 String.还有 1 种复杂数据类型--Object,O ... 
- 如何知道PostgreSQL数据库下每个数据库所对应的目录
			base目录,这是所有数据库目录的父目录. 在base目录下第一层,每个目录就是一个数据库所对应的文件. 那么如何知道哪个目录对应哪个数据呢? 查询如下:先看数据库列表 [pgsql@localhos ... 
