设计模式浅谈--单例模式

来源:互联网 发布:caffe translator 编辑:程序博客网 时间:2024/06/14 21:09

下面简要地说说单例设计模式构造方法私有化,更深入的研究与运行将在以后开一篇文章详细讲解


类的封装性不止体现在对属性的封装上,方法也是可以封装的,在方法封装中也包含了对构造方法的封装.例如:

class Person{private Person(){}//封装构造方法public void print(){System.out.println("Hello world!");}}
如果想对这个类进行操作,必须实例化对象,但是现在构造方法私有化了,如果我们正常用new进行实例化,则肯定会出现错误.封装意味着对外界不可见,就是说我们在外部不能调用它的构造方法,既然外部不能,那么内部么?

class Person{Person person = new Person();//在内部实例化对象private Person(){}public void print(){System.out.println("Hello world!");}}
现在的问题是,我们如何把内部产生的person对象传递到类的外部去?

就要用到static关键字了,因为static声明的属性或者方法可以用类名称直接调用!

class Person{static Person person = new Person();private Person(){}public void print(){System.out.println("Hello world!");}}public class Test{public static void main(String []args){Person p= Person.person;//访问类中的静态属性p.print();}}
可是这样做仍然有个小问题,类中的属性必须封装,外部不能直接调用.所以完善为这样:

class Person{static Person person = new Person();private Person(){}public static Person getPerson(){//因为需要类名直接调用,所以必须是类方法!return person;}public void print(){System.out.println("Hello world!");}}public class Test{public static void main(String []args){Person p= Person.getPerson();//调用类方法p.print();}}
至此,上述程序是个完善的构造方法私有化的demo.


下面我们来看一看这段程序:

class Person{static Person person = new Person();private Person(){}public static Person getPerson(){//因为需要类名直接调用,所以必须是类方法!return person;}public void print(){System.out.println("Hello world!");}}public class Test{public static void main(String []args){Person p1= Person.getPerson();//调用类方法Person p2= Person.getPerson();//调用类方法Person p3= Person.getPerson();//调用类方法p1.print();p2.print();p3.print();}}
这个程序有什么意义呢?

--->以上程序中可以发现,虽然声明了3个Person的对象,但是实际上只是对person对象的引用,也就是说,不管外面对p1,p2,p3这三个对象如何使用,实际上也只有一个实例化对象person存在.如图:


这种设计模式就称之为单例模式

无论程序怎样运行,Person类永远只有一个实例化对象存在.

0 0