什么叫单例设计模式?
字面上的意思:单个实例模式。
那么,如何做到只有一个实例?
有一个真理: 问题,都要从产生处去解决。
对象(即是实例)是如何产生的呢?是利用构造方法去创建的。
那么当我把构造方法私有化进行封装的时候,用户还可以任意的创建对象吗?不能了啊!!!解决~
<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();
}
}
输出结果:
...我只能做到这样了,其他的没想到。这其实也不算是一个成功的例子吧。。。
或许你们能想的到更好的办法!!!
想到的话,求指点哦!!!