java面向对象(十三) 构造方法私有化(单例与多例设计模式)

将构造方法使用private封装.范例1:

class Singleton{
	private Singleton(){
		
	}
	public void print(){
		System.out.println("hello") ;
	}
}
public class Demo{
	public static void main(String args[]){
		Singleton inst = null ; //声明对象
		inst = new Singleton() ; //实例化对象
		inst.print() ;
	}
}
编译结果:


以上程序在实例化Singleton对象时出现了编译错误,因为构造方法被私有化了,无法在外部调用,即无法在外部实例化Singleton对象.

那么如何在保证构造方法和print()方法不修改的情况下让类的外部通过构造方法再去低啊用print()方法呢?

第一步:

使用private定义的操作只能被本类访问,外部无法调用,那么此时就说明这个类的构造方法只能被本类所调用,那么现在在本类中产生本类实例化对象:

class Singleton{
	Singleton instance = new Singleton() ;
	private Singleton(){

	}
	public void print(){
		System.out.println("hello") ;
	}
}
public class Demo{
	public static void main(String args[]){
		Singleton inst = null ;
		//inst = new Singleton() ;
		//inst.print() ;
	}
}
以上程序编译可以通过.

第二步:

对于一个类中的普通属性,一定要在本类存在了实例化对象后才可以调用,但现在在Singleton类的外部无法产生实例化对象,那么此时必须要让Singleton类中的instance属性可以在没有Singleton类实例化对象时进行调用.那么此时可以使用static完成,static定义的属性特点:由类名称直接调用,并且在没有实例化对象时也可以调用.

class Singleton{
	static Singleton instance = new Singleton() ;
	private Singleton(){

	}
	public void print(){
		System.out.println("hello") ;
	}
}
public class Demo{
	public static void main(String args[]){
		Singleton inst = null ;
		inst = Singleton.instance ;
		inst.print() ;
	}
}
运行结果:


第三步:

类中的全部属性,都应该封装,所以以上的instance属性应该封装,而封装后的访问需要getter方法,不过此时的getter方法应该由类名称直接调用,定义为static型.

class Singleton{
	private static Singleton instance = new Singleton() ;
	private Singleton(){

	}
	public void print(){
		System.out.println("hello") ;
	}
	public static Singleton getInstance(){
		return instance ;
	}
}
public class Demo{
	public static void main(String args[]){
		Singleton inst = null ;
		inst = Singleton.getInstance() ;
		inst.print() ;
	}
}
运行结果:


第四步:

如此做的目的是什么?此时的instance属性属于static,表示所有的Singleton类的对象,不管有多少个都共同拥有同一个instance属性.如果现在一个类只希望有唯一的一个实例化对象出现,那就需要将构造方法使用private隐藏起来,使其对外部不可见,那么外部就无法执行对象的实例化操作.

但是还可能出现如下的操作:

class Singleton{
	private static Singleton instance = new Singleton() ;
	private Singleton(){

	}
	public void print(){
		System.out.println("hello") ;
	}
	public static Singleton getInstance(){
		instance = new Singleton() ;
		return instance ;
	}
}
虽然以上代码被允许使用,可是如果这么做,之前表示的 唯一一个实例化对象的所有努力都白费了,所以应该费废除这种做法,此时,可以再定义instance时增加一个final关键字:

class Singleton{
	private final static Singleton instance = new Singleton() ;
	private Singleton(){

	}
	public void print(){
		System.out.println("hello") ;
	}
	public static Singleton getInstance(){
		return instance ;
	}
}
public class Demo{
	public static void main(String args[]){
		Singleton inst = null ;
		inst = Singleton.getInstance() ;
		inst.print() ;
	}
}
运行结果:


这样的代码在设计模式上称为:单例设计模式(Singleton)

单例设计模式的主要特点:构造方法被私有化,只能够通过getInstance()方法取得Singleton类的实例化对象,这样不管外部如何操作,最终也只有一个实例化对象,在单例设计模式中一定会存在一个static方法,用于取得本类的实例化对象.


单例设计模式只留有一个类的实例化对象,而多例设计模式会定义出多个对象.

范例:

class Sex{
	private static final Sex MALE = new Sex("男") ;
	private static final Sex FEMALE = new Sex("女") ;
	private String title ;
	private Sex(String title){
		this.title = title ;
	}
	public static Sex getInstance(String msg){
		switch(msg){
			case"male":
				return MALE ;
			case"female":
				return FEMALE ;
			default:
				return null ;
		}
	}
	public String getTitle(){
		return this.title ;
	}
}
public class Demo{
	public static void main(String args[]){
		Sex male = Sex.getInstance("male") ;
		System.out.println(male.getTitle()) ;
	}
}
运行结果:


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值