Java中的单例设计模式

来源:互联网 发布:如何优化网站代码 编辑:程序博客网 时间:2024/05/08 13:43

设计模式:解决某一类问题最行之有效的方法。

单例设计模式:解决一个类在内存只存在一个对象。

 

想要保证对象唯一。

1,为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象

2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。

3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

 

这三部怎么用代码体现呢?

1,将构造函数私有化。

2,在类中创建一个私有静态的本类对象。

3,提供一个公有静态的方法返回值类型是本类可以获取到该对象。

 

对于事物该怎么描述,还怎么描述。

当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可。

 

class SingleDemo

{

       publicstatic void main(String[] args)

       {

              Students1 = Student.getStudent();

              Students2 = Student.getStudent();//唯一,s1 s2是同一个对象

 

 

class Student

{

       privateint age;

 

这    //privatestatic Student s = new Student();加个final就更加严谨privatestatic final Student s=new Student();这两种方法都可以

              3     //private Student(){}

              步    //publicstatic Student getStudent()

                     //{

                     //     return s;

                     //}

 

 

 

       publicvoid setAge(int age)

       {

              this.age= age;

       }

       publicint getAge()

       {

              returnage;

       }

 

 

以上是饿汉式!!!

以下是懒汉式!!!

 

懒汉式代码:

       privatePerson(){}

       privatestatic Person p = null;//进内存还没对象

       publicstatic Person getPerson()

       {

              if(p== null)

                     p= new Person();//调用方法时才创建对象;

              returnp;

       }

       一般开发中是不使用懒汉式的,因为在多线程中不安全;

       此时我们改一下懒汉式:

       privatePerson(){}

       privatestatic Person p = null;//进内存还没对象

       publicstatic Person getPerson()

       {

              if(p== null)//加这重判断是为了优化代码,如果p都不等于null了,那么就直接锁都不拿了;

              {

synchronized(Person.class)//把(多线程)所操作的共享数据语句用synchronize代码块包起来。

并且锁是类的字节码文件对象

                     {                                        //当一个线程拿到锁进来后判断p之后躺了(cpu资源被别的线程抢了),

                                                               //别的线程会因为拿不到锁而等待,只能等待躺了的线程重新抢到cpu

                                                               //执行权并执行完语句;

                            if(p== null)

                                   p= new Person();//调用方法时才创建对象;

                     }

              }

              return p;

        }

 

 

 

 

0 0
原创粉丝点击