Java设计模式之单例(Singleton)

构造方法私有化 ---> 单例设计模式

一个类想要使用必须具有实例化对象(instance),但是如果构造方法私有化之后,在类的外部是无法调用构造方法来实例化对象的,如下代码:

class Singleton {
	
	private Singleton(){}
	
	public void print(){
		System.out.println("It is singleton!");
	}
}

public class SingletonDemo{
	public static void main(String args[]){
		
		Singleton instance = null;	//可以声明对象
		instance = new Singleton(); //error, 因为构造方法私有化,无法实力化对象
		s.print();
	}
}

2.构造方法私有化之后,在类的外部是无法通过调用构造方法来实例化对象,但是在类的内部呢,可以吗?如下代码:

class Singleton {
	
	Singleton instance = new Singleton();
	private Singleton(){}
	
	public void print(){
		System.out.println("It is singleton!");
	}
}

3.以上代码编译时正确的,那么此时的重点就是如何将内部的instance传递到类的外部去,这样在类的外部就可以通过instance来实例化Singleton的对象,该如何获取呢?使用static来修饰instance属性,这样就可以通过类名称直接调用instance属性,代码如下:

class Singleton {
	
	static Singleton instance = new Singleton();
	private Singleton(){}
	
	public void print(){
		System.out.println("It is singleton!");
	}
}

public class SingletonDemo{
	public static void main(String args[]){
		
		Singleton instance = null;	//声明对象
		instance = Singleton.instance; //实力化对象
		instance.print(); //打印信息:It is singleton!
	}
}

4.以上代码可以正确执行,但是在类的设计中,我们应该注意对于类的属性我们应该进行封装,即private关键字修饰,此时在类的外部Single.instance是无法访问成功的,那么 此时就应该通过getter方法来访问类中被封装的属性instance,由于instance使用了static修饰,所以此时该方法应该是static方法,代码如下:

class Singleton {
	
	private static Singleton instance = new Singleton();
	private Singleton(){}
	
	//饿汉式,获取实例化对象instance
	public static Singleton getInstance(){
		return instance;
	}

	public void print(){
		System.out.println("It is singleton!");
	}
}

public class SingletonDemo{
	public static void main(String args[]){
		
		Singleton s1 = Singleton.getInstance(); //访问类中的静态方法,取得对象实例
		Singleton s2 = Singleton.getInstance(); //访问类中的静态方法,取得对象实例
		Singleton s3 = Singleton.getInstance(); //访问类中的静态方法,取得对象实例
		
		s1.print(); //打印信息:It is singleton!
		s2.print(); //打印信息:It is singleton!
        s3.print(); //打印信息:It is singleton!
	}
}
以上程序中虽然声明了3个singleton对象,但是这三个对象都是指向了同一个instance引用,即本质上只有一个实例化对象的存在,这种设计模式称作单例设计模式。内存图:

内存图

当然,单例设计模式有懒汉式与饿汉式,上述例子中是饿汉式,下面给出懒汉式代码:

class Singleton {
	
	private static Singleton instance = null;
	private Singleton(){}
	
	//懒汉式,获取实例化对象instance
	public static Singleton getInstance(){
		if (instance == null){
			instance = new Singleton();
		}
		return instance;
	}

	public void print(){
		System.out.println("It is singleton!");
	}
}

最后,需要知道,只要将构造方法私有化,就可以控制实例化对象的产生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值