设计模式学习之单例模式(Singleton,创建型模式)(4)

假如程序中有一个Person类,我的需求就是需要在整个应用程序中只能new一个Person,而且这个Person实例在应用程序中进行共享,那么我们该如何实现呢?

第一步:

新建一个Person类,类中我们将构造函数私有化,这样就不能再外部new一个了

第二步:

我们在公开一个Person属性实例或者获取Person实例的方法就可以在外部得到Person实例了,ok,看下面代码吧

代码如下:

 单例模式的懒汉式实现

Person.java

设计模式学习之单例模式(Singleton,创建型模式)(4)
package com.designpattern.singleton;

public class Person {
    private String name;
    private int age;
    //饿汉式
    public static final Person PERSON = new Person();
    private Person(){}
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
设计模式学习之单例模式(Singleton,创建型模式)(4)

MainClass.java

设计模式学习之单例模式(Singleton,创建型模式)(4)
package com.designpattern.singleton;

public class MainClass {

    public static void main(String[] args) {
        //假如我希望整个应用程序中只能有一个人,也就是说只能new Person()一次,只能存在一个Person实例
        
        /*
         * 单例模式第一种实现:饿汉式
         */
//        Person person = Person.PERSON;
//        person.setName("jack");
//        Person person2 = Person.PERSON;
//        person2.setName("jack1");
//        System.out.println(person.getName());
//        System.out.println(person2.getName());//结果姓名相同,都为jack1
        
        /*
         * 单例模式第二种实现:懒汉式,这种方式在多线程下是不安全的
         */
//        Person2 person = Person2.getPerson2Instance();
//        person.setName("jack");
//        Person2 person2 =  Person2.getPerson2Instance();
//        person2.setName("jack1");
//        System.out.println(person.getName());
//        System.out.println(person2.getName());//结果姓名相同,都为jack1
        
        /*
         * 单例模式第三种实现:双重验证,多线程下安全
         */
        Person2 person = Person2.getPerson2Instance2();
        person.setName("jack");
        Person2 person2 =  Person2.getPerson2Instance2();
        person2.setName("jack1");
        System.out.println(person.getName());
        System.out.println(person2.getName());//结果姓名相同,都为jack1
    }

}
设计模式学习之单例模式(Singleton,创建型模式)(4)

单例模式的懒汉式和在多线程下双重验证实现
Person2.java

设计模式学习之单例模式(Singleton,创建型模式)(4)
package com.designpattern.singleton;

public class Person2 {
    private String name;
    private int age;
    private static Person2 person2;
    private Person2(){}
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    /**
     * 单线程获取person2单个实例
     * @return
     */
    public static Person2 getPerson2Instance(){
        if (person2==null) {
            person2 = new Person2();
        }
        return person2;
    }
    
    /**
     * 多线程获取person2单个实例
     * @return
     */
    public static Person2 getPerson2Instance2(){
        if (person2==null) {
            synchronized (Person2.class) {
                if (person2==null) {
                    person2 = new Person2();
                }
            }
            
        }
        return person2;
    }
    
}
设计模式学习之单例模式(Singleton,创建型模式)(4)

一、什么是单例模式

单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

其实,GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。

 

二、为什么要使用单例模式呢?

在应用系统开发中,我们常常有以下需求:

- 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象

- 在整个程序空间使用全局变量,共享资源

- 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

 因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。

 

三、单例模式实现

1.饿汉式。

2.懒汉式。

3.双重检查。

设计模式学习之单例模式(Singleton,创建型模式)(4)

上一篇:九位名人美到极致的句子。读这样的句子,是一种享受。


下一篇:Unity3D笔记十四 力