黑马程序员_单例设计模式总结

/*
设计模式:对于解决某一问题最行之有效的解决方案

问题:一个类在内存中只有一个对象存在
解决方案:单例模式

单例模式:饿汉式、懒汉式
实现思想:
1、禁止其他类创建类的对象
2、自己在本类中创建本类对象
3、对外提供一个对该对象的访问方式
实现步骤:
1、将构造函数私有化
2、在类中创建一个本类的对象。
3、用一个方法对外提供本类对象。

*/
/*懒汉式,会出现安全问题,所以需要改进一下,利用的是多线程的技术*/

class Single
{
	private static Single s = null;
	private String name ;
	public void setName(String name)
	{
		this.name = name;
	}
	public  String getName()
	{
		return name;
	}
	private Single(){}
////	为了防止多线程同时进入getInstance()函数内,导致出现创建多个对象存在。
////	而使用了synchronized关键字,使得在任意时间内,只有一个线程可以进入该函数内,其他函数在进入时,
////	需对其进行判断。但是假如了关键字synchronized之后,整个程序的运行效率就降低了,使得所有线程在执行到
////	getInstance()函数时,都要对其进行判断,是否有其他线程正在函数中,有则等待,无则进入,从而使得程序效率降低
//	public static synchronized Single getInstance()
//	{
//		if(s == null)
//		{
//			s = new Single();
//		}
//		return s;
//	}
	/*懒汉式终极版*/
	public static Single getInstance()
	{
		if(s == null)
		{
			synchronized (Single.class) //在此处加锁,而不是整个函数加锁,使得判断锁的次数减少,
			{							//从而使得效率提高
				if(s == null)
				{
					s = new Single();
				}
			}
		}
		return s ;
	}
}

///*懒汉式
//	类的对象延迟创建。
//*/
//class Single
//{
//	private String name;
//	private static Single s = null;
//	public void setName(String name)
//	{
//		this.name = name;
//	}
//	public String getName()
//	{
//		return name;
//	}
//	private Single(){}
//	public static Single getInstance()
//	{
//		if(s == null)
//		{
//			s = new Single();
//		}
//		return s;
//	}
//}
/*饿汉式:饿汉式是在实际开发中使用的技术,因为其是安全的,类的对象随着类的加载而创建。因为是随着类的
加载而创建,所以是一旦加载该类,类对象就在堆内存中创建了,并将对象的引用赋值给了方法区中的静态类对象的引用。
无论是饿汉式,还是懒汉式,获取类对象的方法必须是静态的,因为只有这样才能够通过类名调用该方法,因为唯一的类
对象在类中成员函数中或者成员变量初始化中才会被创建的。
	实现单例模式必须满足下满几点:
	1、类的初始化函数必须被私有化,也就是必须禁止在类的外部用new创建对象。

	2、因为1存在,所以必须使用 “类名.方法” 的方式获得在类内部用new创建的对象。

	3、因为2存在,所以必须将 “类对象的获取方法” 静态化,从而使得通过类名可以访问到类的成员。

	4、因为3存在,所以必须将类对象的引用静态化,否则不能够在方法中返回类对象的引用(句柄)。

	综上:
		1、类的构造函数必须被私有化
		2、类对象的引用必须是私有化而且是静态化
		3、类对象的获取方法必须是公有化且静态化
		4、类对象的获取方法的调用必须是“类名.方法”的形式

*/
//class Single
//{
//	private String name ;
//
//	private static Single s = new Single();
//	private Single(){}
//	public void setName(String name)
//	{
//		this.name = name;
//	}
//	public String getName()
//	{
//		return name;
//	}
//	public static Single getInstance()
//	{
//		return s;
//	}
//}
class SingleDemo
{
	public static void main(String[] args)
	{
		Single s1 = Single.getInstance();
		s1.setName("张三");
		System.out.println(s1.getName());
		Single s2 = Single.getInstance();
		s2.setName("李四");
		System.out.println(s2.getName());
	}
}

  

时间: 2024-10-07 11:20:45

黑马程序员_单例设计模式总结的相关文章

黑马程序员_毕向东_Java基础视频教程_Java基础学习知识点总结

黑马程序员_毕向东_Java基础视频教程 Java基础学习知识点总结 2016年01月06日  day01 一.基础知识:软件开发 1.什么是软件?软件:一系列按照特定顺序组织的计算机数据和指令的集合. 2.常见的软件:系统软件:如:DOS,Windows,Linux等.应用软件:如:扫雷,迅雷,QQ等. 3.什么是开发?制作软件. 二.基础知识:人机交互方式 4.软件的出现实现了人与计算机之间的更好的交互. 5.交互方式:图形化界面:这种方式简单直观,使用者易于接受,容易上手操作.命令行方式:

黑马程序员_多线程

------- android培训.java培训.期待与您交流! ---------- 多线程1.进程: 正在运行的程序所占有的内存空间,叫做进程. 线程: 一个应用程序中的子程序,对于CPU,子程序可以有一条独立的执行路径,称为线程. 线程特点:依靠一个应用程序,对于其他子程序,独立被CPU执行的2.多线程的好处: 充分利用CPU的资源,程序的同时运行,提高效率3.java中线程创建的两种方法: 第一种: 定义类继承Thread class extends Thread 重写Thread中的r

黑马程序员_第一天视频学习

一.      计算机和软件常识 1.      计算机运行原理 1)          硬件基本组成:硬盘.内存.CPU 2)          各个部件之间的运作协调(下图) 2.      计算机只能识别0和1 1)          0和1组成的指令 2)          0和1组成的数据 3.      计算机和软件的联系 1)          软件的基本概念:指令的集合 2)          软件的安装运行过程 3)          为什么要开发软件:写出能控制计算机的指令

黑马程序员_集合

集合1.集合和对象数组的区别: 数组的长度不可变,集合的可变: 数组可以存储基本数据类型和对象,集合只能存储对象. 集合的框架图 集合派系的顶层接口Collection1.Collection集合存储对象的方法: add(E e)将元素存储到集合中 addAll(Collection c)将一个集合添加到另外的集合中2.Collection集合提取对象的方法: 通过迭代器iterator中的方法:hasNext()和next()来取出 Iterator it=new iterator(); wh

黑马程序员_学习IOS之字典常用的方法

字典是无序的 数组是有序的.字典分为:可变字典和不可变字典  不可变字典对象 NSDictionary * dict = [[NSDictionary alloc]initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3",@"four",@"4", nil]; //value = ke

黑马程序员_交通灯管理系统

(1)项目的需求 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 例如: 由南向而来去往北向的车辆 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 平时开车过十字路口红绿灯的时候,也知道红绿灯运行的顺序 (1)任何方向的车,向右边转弯的时候,是不需要看红绿灯 (2)在十字路口,相对方向的红绿灯的工作方式是一样的,南相对与北,东相对与西,这把它分成两对 (3)红绿灯顺序,一对直行通道绿灯直行车辆,等直行变红,还是这对的车辆可以左转,等左转变红,就轮到下一对了.所以在设计程序的时候,只

黑马程序员_ 利用oc的协议实现代理模式

先说下代理模式是什么吧 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象 而代理对象可以在客户端和目标对象之间起到中介的作用. 在看过李明杰老师的课程后,我对代理模式有了最初步的理解,虽然还很浅显 但是也明白了代理模式的 一些作用跟用法.首先使用代理模式可以降低耦合度.大大的增强了代码的弹性. 举个例子,小明想看电影,但是没时间买票 于是就拜托小强去买票 最简单的方式就是 建立一个person类(小明) 一个agent类(代理类) ag

黑马程序员_银行业务调度系统

1,项目的具体需求 银行业务调度系统 模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费.电话费之类业务的客户). 异步随机生成各种类型的客户,生成各类型用户的概率比例为: VIP客户 :普通客户 :快速客户 = 1 :6 :3.   客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速

黑马程序员_构造函数间的调用

这是我的第一篇博客,从这篇开始我将记录下学习java的心得体会,欢迎志同道合的朋友随时与我讨论,共同进步. 我们都知道,函数间可以互相调用.构造函数是一种特殊的函数,它用来给对象进行初始化,如果想在构造构造函数中调用另一个构造函数,分为以下两种情况: 1.子类调用父类的构造函数 先来看一段代码 1 class Person 2 { 3 public Person() 4 { 5 // 构造语句 6 } 7 } 8 9 class Student extends Person 10 { 11 pu