首页 > 其他 > 详细

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

时间:2014-01-21 17:45:13      阅读:384      评论:0      收藏:0      [点我收藏+]

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

第一步:

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

第二步:

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

代码如下:

 单例模式的懒汉式实现

Person.java

bubuko.com,布布扣
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;
    }
}
bubuko.com,布布扣

MainClass.java

bubuko.com,布布扣
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
    }

}
bubuko.com,布布扣

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

bubuko.com,布布扣
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;
    }
    
}
bubuko.com,布布扣

一、什么是单例模式

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

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

 

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

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

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

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

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

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

 

三、单例模式实现

1.饿汉式。

2.懒汉式。

3.双重检查。

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

原文:http://www.cnblogs.com/yxlblogs/p/3527735.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!