首页 > 代码库 > 设计模式—单例模式1·思维过程

设计模式—单例模式1·思维过程

前言

    本文介绍设计模式中的单例模式的思维过程。设计模式是一种思想,在各种编程语言的编程中都可以使用,比如javaC#。这里只是以java语言为例。顾名思义,单例模式在java中的意思就是不管程序怎么运行,都只会有一个对象。比如对类Student使用了单例模式,那么,不管在其他的类中怎么使用Student类的对象,都应该是同一个。下面,就顺着这个思路,来探讨怎么在java中使用单例模式。

一、思维过程

1.1、构造方法私有化

    既然目标是整个程序中只能创建一个对象,那么在其他类中任意创建对象的这种行为肯定是不允许的。比如想要将Student类设定成单例模式,那么下面这种情况肯定不允许:

class Test{
        
            Student s1 = new Student();
            Student s2 = new Student();
        
}
class Student {
        
}

 

  很明显,上面给了其他类创建Student对象的机会,那么就会产生无数个对象。所以想要创建单例模式,第一件事就是不能给别的类new自己的机会。要做到这一点很简单,只要将自己的构造方法声明成private的即可,这样,当别的类想要new自己的时候,会报错,情况如下图所示:

 技术分享

 

1.2、自己new自己

    通过构造方法私有化,现在外部类不能new自己了,但是目标是单例,也就是只能创建一个对象,现在外面一个对象都创建不了了,所以此时我们只能自己(本文中就是指Student类)来创建自己,代码如下所示:

class Student {
    
        Student s = new Student();
        private Student() {
        }
}

 

1.3、提供方法给外部使用

    通过1.2中的操作,现在可以创建出Studnet类的对象了,且只会创建一个(因为只会new一次),也就达到了单例的要求。但是要想给外部使用,还需要提供一个方法(就像提供get方法给外部访问自己私有成员变量的机会一样),将自己创建的对象返回回去。既然要给外部调用,那么这个方法就应该是public的。

    代码如下所示:

class Student {
    
            Student s = new Student();
            private Student() {
        }    
    
        public Student getInstance() {
        
            return s;
        }
}

    但是,现在外部还是使用不了getInstance()方法,因为getInstance()方法需要Student类的对象才能调用,但是外部现在创建不了 Studnet类的对象,所以现在要做的就是将该方法改为static的,另外,既然方法变为了staitc的,那么其中使用的变量也应该变成static的,代码如下所示:

class Student {
    
        private static Student s = new Student();
        private Student() {
        }
    
        public static Student getInstance() {
        
            return s;
        }    
}

 

1.4、小结

    通过上面三步,现在外部想要创建Studnet类的对象,就只能通过调用Student类的静态方法getInstance(),getInstance()方法返回的又是只会创建一次的Student类对象,这样,就实现了单例模式。

  单例模式创建的三部曲:

    1.构造方法私有化

    2.自己创建自己的对象

    3.提供static的方法返回自己创建的对象

 

二、测试

    代码:

    获取两个Studnet类的对象,如果是单例,那么这两对象s1s2的地址应该是相等的,也就是输出结果是true,否则是false

public class Test{
        
        public static void main(String[] args) {
                
            Student s1 = Student.getInstance();
            Student s2 = Student.getInstance();
            System.out.println(s1==s2);            
        }    
        
}
class Student {
    
        private static Student s = new Student();
        private Student() {        
        }    
        public static Student getInstance() {    
            return s;
        }
}

    输出结果:

技术分享

 

 

 

 

 

 

 

 

 

 

 

 

设计模式—单例模式1·思维过程