学习总结(三):设计模式之单例模式

前言

很多时候,一个类被要求只能实例化一次,比如说任务管理器(不能打开多个),安卓开发中的fragment。这时候就要考虑单列模式,让一个类只能实例化一个对象。

介绍

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

代码

下面给出单例模式的几种实现方法:
1.饿汉式1
该方法将类的构造器私有化,在类中私有地创建对象,再通过public方法返回对象a的引用。所以对对象的调用只能通过A.get_a()获取。值得注意的是,为了 直接通过类名调用方法,获取对象的方法需要用static来修饰。而static方法中只能调用静态属性,所以在创建对象时也要用static修饰。且,静态属性(对象a)属于类本身而不属于类的任何实例,可以被看做是存储在类当中的全局变量。

class A{
	private A() {}//私有化构造器
	private static A a = new A();//创建对象时,static修饰
	public static A get_a() {//获取对象的方法
		return a;
	}
	public void method() {
		System.out.println("A中方法被调用");
	}
}
public class Test {
	public static void main(String[]args) {
	//该单例模式下类的实例化
	//A.get_a()每次返回的都是静态变量a
		A.get_a().method();//调用方法,输出
	}
}

2.饿汉式2
其实和上面的方法差不多,只不过将对象a的实例化放在了静态代码块里了。静态代码块随着类的加载而执行,且只执行一次。所以对象a只被实例化一次。

class A{
	private A() {}//私有化构造器
	private static A a = null;//可以看作全局变量,刚开始a为null,静态代码块加载后被实例化
	static{
		a = new A();//在A加载的时候执行一次,以后不再执行
	}
	public static A get_a() {
		return a;
	}
	public void mothod() {
		System.out.println("A中方法被调用");
	}
}
public class Test {
	public static void main(String[]args) {
		A.get_a().mothod();
	}
}

3.懒汉式
与饿汉式2基本相同,只是没用静态代码块的特性,而是采用每次调用静态方法时判断对象a是否为空,为空则实例化。

class A{
	private A() {}//私有化构造器
	private static A a = null;//可以看作全局变量,刚开始a为null,静态代码块加载后被实例化
	public static A get_a() {
		if(a==null){
		a = new A();
		}
		return a;
	}
	public void mothod() {
		System.out.println("A中方法被调用");
	}
}
public class Test {
	public static void main(String[]args) {
		A.get_a().mothod();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值