java单例设计模式

来源:互联网 发布:itunes windows xp 编辑:程序博客网 时间:2024/05/16 11:03

什么叫单例设计模式?

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


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

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


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

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


<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();//改变iSystem.out.println("我现在改变d1所指向的对象中i的值--------------");d1.print();d2.print();d3.print();}}

输出结果:





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


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


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


0 0