java单例设计模式

什么叫单例设计模式?

字面上的意思:单个实例模式。


那么,如何做到只有一个实例?

有一个真理:
问题,都要从产生处去解决。


对象(即是实例)是如何产生的呢?是利用构造方法去创建的。

那么当我把构造方法私有化进行封装的时候,用户还可以任意的创建对象吗?不能了啊!!!解决~


<pre name="code" class="java">class SingleObjectDemo{
	private SingleObjectDemo(){
		System.out.println("我创建了一个对象~~~~");	
	}
}

 
好,这个问题解决了,可是另一个问题也就来了。那么在那里创建对象? 

也很简单的就知道啊,私有化只能在本类里引用,那么就是说必须要在本类里创建了,别无选择。

class SingleObjectDemo{
	
	public static SingleObjectDemo d = new SingleObjectDemo(){};	

	private SingleObjectDemo(){
		System.out.println("我创建了一个对象~~~~");	
	}
}

当我们创建好一个对象的时候,只能通过static修饰对象的引用,这样用户才能拿的到。

他也是一个引用属性,按照类里对属性进行封装的原则,我们要对属性进行私有化封装private;通过setter和getter方法来设置和获取。(setter在这里就不要了)

class SingleObjectDemo{
	
	private static SingleObjectDemo d = new SingleObjectDemo(){};	

	private SingleObjectDemo(){
		System.out.println("我创建了一个对象~~~~");	
	}

	public static SingleObjectDemo getSingleObjectDemo(){
		return d;
	}
}

这样一个单例的设置模式就好了,下面我们来对它进行小小的测试。

class SingleObjectDemo{

	private static int count = 0;					//记录创建对象个数。

	private int i = 1;						//测试是否为同一对象的int值。
	
	private static SingleObjectDemo d = new SingleObjectDemo(){};	

	private SingleObjectDemo(){
		System.out.println("我创建了一个对象~~~~");
		count ++;
	}

	public static SingleObjectDemo getSingleObjectDemo(){		//返回一个对象
		return d;
	}

	public void print(){
		System.out.println("创建了对象数为:"+count+"\t现在i的值为:"+i);
	}
	
	public void add(){						//改变i的值
		i++;
	}
		
}

class Test{
	public static void main(String args[]){
		SingleObjectDemo d1 =SingleObjectDemo.getSingleObjectDemo();		//获取一个对象
		SingleObjectDemo d2 =SingleObjectDemo.getSingleObjectDemo();		//获取一个对象
		SingleObjectDemo d3 =SingleObjectDemo.getSingleObjectDemo();		//获取一个对象
		
		d1.print();								//打印信息。
		d2.print();
		d3.print();
	
		d1.add();
		
		System.out.println("我现在改变d1所指向的对象中i的值--------------");		

		d1.print();
		d2.print();
		d3.print();
	}
}

测试结果为:



好了。
突然想了想,这只是无参数构造函数的单例哦。能不能写出有参数的单例?
我只能想到了下面的设置并获取有参数的实例的方法。

只需要改动为:

class SingleObjectDemo{

//这里新增对象的属性
	private static int yyy;		
	private static int xxx;
	private static int zzz;
	private static int count = 0;					//记录创建对象个数。

	private int i = 1;						//测试是否为同一对象的int值。



	private static SingleObjectDemo d = new SingleObjectDemo(){};	

	private SingleObjectDemo(){
				
		System.out.println("我创建了一个对象~~~~");
		count ++;
	}

	public static SingleObjectDemo getSingleObjectDemo(int x,int y,int z){		//返回一个对象

		xxx = x;
		yyy = y;
		zzz = z;
		return d;
	}

	public void print(){
		System.out.println("创建了对象数为:"+count+"\t现在i的值为:"+i);
		System.out.println("xxx:"+xxx+"yyy:"+yyy+"zzz:"+zzz);
	}
	
	public void add(){									//改变i的值
		i++;
	}
		
}

class Test{
	public static void main(String args[]){
		SingleObjectDemo d1 =SingleObjectDemo.getSingleObjectDemo(1,2,3);		//获取一个对象
	
		d1.print();

		SingleObjectDemo d2 =SingleObjectDemo.getSingleObjectDemo(4,5,6);		//获取一个对象

		d2.print();

		SingleObjectDemo d3 =SingleObjectDemo.getSingleObjectDemo(7,8,9);		//获取一个对象
		
		d3.print();
	
		d1.add();									//改变i
		
		System.out.println("我现在改变d1所指向的对象中i的值--------------");		

		d1.print();
		d2.print();
		d3.print();
	}
}

输出结果:





...我只能做到这样了,其他的没想到。这其实也不算是一个成功的例子吧。。。


或许你们能想的到更好的办法!!!


想到的话,求指点哦!!!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值