java 设计模式之单例模式

--------2015-11-20 14:45:10

java设计模式之单例模式(Singleton)

---应用场合:只需要一个对象就可以了,例如一个朝代一个皇帝。

---作用:保证某个应用程序中某个实例有且只有一个。共同使用一个,节省资源。

---类型:饿汉模式,懒汉模式。

一.饿汉模式(类加载的时候就会实例化,线程安全)

 1 package com.sun.singleton;
 2
 3 //饿汉模式
 4 public class Singleton {
 5
 6     //将构造函数私有化,不允许外部直接调用创建对象
 7     private Singleton(){
 8
 9     }
10     //内部创建类的唯一实例,用private static 修饰(加载类时实例化一次,之后无论调用几次用的都是这一个实例)
11     private static Singleton instance = new Singleton();
12
13     //提供一个外部用于获取实例的方法,用 public static 修饰
14     public static Singleton getInstance(){
15         return instance;
16     }
17
18 }

二. 懒汉模式(比较懒,所以只有调用方法getInstance时候根据判断结果才会实例化,而且线程不安全)

package com.sun.singleton;
//懒汉模式(线程不安全)
public class Singleton2 {

    //1.构造函数私有化,不允许外部直接调用
    private Singleton2(){

    }

    //2.只是声明类的唯一实例,这时没有真正实例化,使用private static 修饰
    private static Singleton2 instance;

    //3.提供获取实例的方法,用public static修饰
    // (1).解决线程不安全-------加同步(每个线程每次获取实例都要判断下锁,效率比较低)
    public static synchronized Singleton2 getInstance(){
        if(instance == null){
            return instance = new Singleton2();
        }
        return instance;
    }

    //(2).解决线程不安全-----双重检查锁定(提高效率)
    public static Singleton2 getInstance2(){
        /*如果第一个线程获取到了单例的实例对象,后面的线程再获取实例的时候不需要进入同步代码块中了*/
        if(instance == null){
            synchronized (Singleton2.class) {
                if(instance == null){
                    instance = new Singleton2();
                }
            }
        }
        return instance;
    }

}

输出:

package com.sun.singleton;

public class Main {

    public static void main(String[] args) {

        //实例化两次作比较测试
        //饿汉式
        Singleton s1= Singleton.getInstance();
        Singleton s2= Singleton.getInstance();
        if(s1==s2){
            System.out.println("饿汉式是同一个实例");
        }else{
            System.out.println("饿汉式不是同一个实例");
        }
        //懒汉式
        Singleton2 s3 = Singleton2.getInstance();
        Singleton2 s4 = Singleton2.getInstance();
        if(s3==s4){
            System.out.println("懒汉式是同一个实例");
        }else{
            System.out.println("懒汉式不是同一个实例");
        }

    }

}

结果截图:

说明单例模式是同一个对象实例化是共享一个内存空间。

两者区别:

饿汉模式:类加载的时候比较慢(加载时候实例化),但是运行时候比较快,线程安全。

懒汉模式:类加载的时候比较快,但是运行时候比较慢(调用方法的时候实例化),线程不安全。

新手的学习笔记:这是自己学习过程中的记录,方便自己回顾,好记性不如烂笔头,多多指教。

作者:艺至

------------2015-11-20 16:42:51

时间: 2024-12-13 03:10:23

java 设计模式之单例模式的相关文章

(九)JAVA设计模式之单例模式

JAVA设计模式之单例模式 一.单例模式的介绍 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点.     全局对象和Singleton模式有本质的区别,因为大量使用全局对象会使得程序质量降低,而且有些编程语言根本不支持全局变量.最重要的是传统的全局对象并不能阻止一个类被实例化多次. 二.单例模式的特点 单例类只能有一个实例 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例.

java设计模式之单例模式(Singleton)

Java设计模式之单例模式 单例模式是什么? 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式如何来设计呢? 保证一个类只能有一个实例,那么我们不能无限制的new 来创建,因为我们知道,new一次就是一个新的对象,那么构造器只能私有化private -- 构造器私有化 构造器私有化了,问题又出现了,构造器私有化了,那么我们怎么来创建唯一的对象呢?-- 提供一个公有的方法/提供一个公有的静态属性 再分析一下,公有方法, 实例方法还是类方法呢?--公有的类方法(获取类实例) 依据以上

java设计模式之单例模式(Singleton pattern)

java设计模式之单例模式(Singleton pattern) 单例模式的定义: Singleton pattern restricts the instantiation of a class and ensures that only one instance of the class exists in the java virtual machine. The singleton class must provide a global access point to get the i

Java设计模式之单例模式(七种写法)

Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleton instance; private Singleton (){}//私有化构造方法,防止类被实例化 public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } retu

折腾Java设计模式之单例模式

博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access to it. 一个类仅仅只有一个实例,并且提供全局的接入点.简洁点理解就是涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问它自己唯一的对象的方式,可以直接访问,不需要实例化该类的对象. 饿汉式单例模式 public final class EagerSi

Java设计模式:单例模式

概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能

[转]JAVA设计模式之单例模式

原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话

Java 设计模式(3)单例模式

前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,

JAVA设计模式之单例模式(转)

本文继续介绍23种设计模式系列之单例模式. 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器