设计模式整理_单例设计模式

  单例设计模式,它确保一个类只有一个实例,并提供一个全局访问点.

  由于单例设计模式对应的类只能创建一个对象,因此它所对应的方法必须是static(不是static只有创建对象才能调用).

  以下是单例模式的一个经典实现:采用了延迟加载对象的例子.

  

public class Single1 {
    private static Single1 single;    //利用一个静态变量来记录Single1的唯一实例,这里没有直接声明,采用了延迟加载模式.
    private Single1(){}                //把构造器声明为私有的,只有在Single1类内才可以调用构造器.
    public static Single1 getInstance() {
        if(single==null) {
            single=new Single1();        //利用getInstance方法实例化对象.
        }
        return single;
    }
    //其他方法.Single1作为一个正常的类,应该是有其他方法的.
}

  但是上述实现有个重要的缺点,在多线程环境下是可能产生两个对象的.例如如下代码:

public class Test {
    public static void main(String[] args) {
        Thread t1=new Thread(){
            public void run() {
                for(int i=0;i<2;i++) {
                    System.out.println(Thread.currentThread().getName()+Single1.getInstance());
                }
            }
        };
        Thread t2=new Thread(){
            public void run() {
                for(int i=0;i<2;i++) {
                    System.out.println(Thread.currentThread().getName()+Single1.getInstance());
                }
            }
        };
        t1.start();
        t2.start();
    }
}

将产生如下的输出:

Thread-[email protected]
Thread-[email protected]
Thread-[email protected]
Thread[email protected]

  可以看出,已经产生了两个对象,这是因为getInstance方法,没有同步的缘故,但是如果直接在方法上增加了同步的话,势必会造成每次获取对象都要获得锁造成效率降低,因此最好的方法是在第一次获取对象的时候,采用同步,具体的做法见如下代码:

public class Single1 {
    private volatile static Single1 single;    //在两个或多个线程访问的成员变量上采用volatile关键字.确保多个线程正确处理变量
    private Single1(){}
    public static Single1 getInstance() {
        if(single==null) {
            synchronized(Single1.class) /*只有第一次才彻底执行这里的代码.*/{
                if(single==null)    //进入区域后再检查一次,如果仍是null,才检查实例.
                single=new Single1();
            }
        }
        return single;
    }
}

  在对于对资源要求不苛刻的情况下,可以采用直接加载的方式,这时候就不需要加同步了.

public class Single1 {
    private  static Single1 single=new Single1();
    private Single1(){}
    public static Single1 getInstance() {
        return single;
    }
}
时间: 2024-11-02 01:42:02

设计模式整理_单例设计模式的相关文章

Java面向对象_单例设计模式

单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 1.构造方法私有化 2.声明一个本类对象 3.给外部提供一个静态方法获取对象实例 两种实现方式:饿汉式和懒汉式 何种情况下使用呢?当一个类中没有属性(对象的状态):该类作为工具类使用非常频繁: 好处:节省内存(因为不断创建对象会消耗内存) 1 public class Practice14 { 2 3 public static void main(String[] args) { 4 // TODO Auto-generate

设计模式(一)__单例设计模式

先来介绍一下什么是设计模式,设计模式起先是从建筑行业借鉴来的,然后慢慢发展到了今天这个样子. 设计模式是解决问题最行之有效的思想,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. java有23种设计模式,今天就先来介绍一种:单例设计模式 单例设计模式: 有时候当你需要保证一个类在内存中的对象唯一性的时候,比如多程序读取一个配置文件时,建议配置文件封装成对象.会方便操作其中数据,又要保证多个程序读到的是同一

设计模式之:单例设计模式

单例设计模式 单例设计模式概述 单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供. 优点 在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能. 缺点 没有抽象层,因此扩展很难. 职责过重,在一定程序上违背了单一职责 单例模式: 饿汉式:类一加载就创建对象 懒汉式:用的时候,才去创建对象 例子1:单例设计模式之饿汉式 public classStudent { // 构造私有 private Student()

设计模式学习笔记——单例设计模式

1.特点:只需一个实例时考虑. 2.概念:保证一个类仅有一个实例,并提供一个供访问的全局点. 3.类图: 4程序实现: 1)懒汉式:对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备.它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回.懒汉模式只在外部对象第一次请求实例的时候才去创建.懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快.它在整个应用的生命周期只有一部分时

黑马程序员_单例设计模式总结

/* 设计模式:对于解决某一问题最行之有效的解决方案 问题:一个类在内存中只有一个对象存在 解决方案:单例模式 单例模式:饿汉式.懒汉式 实现思想: 1.禁止其他类创建类的对象 2.自己在本类中创建本类对象 3.对外提供一个对该对象的访问方式 实现步骤: 1.将构造函数私有化 2.在类中创建一个本类的对象. 3.用一个方法对外提供本类对象. */ /*懒汉式,会出现安全问题,所以需要改进一下,利用的是多线程的技术*/ class Single { private static Single s

单例设计模式

一:单例设计模式的定义 单例设计模式,顾名思义,就是在整个程序运行过程中,只向外界提供一个对象,这样做可以避免资源的浪费,例如 我们打开回收站或者ppt时,只会启动一个窗口. 单例模式的java实现: 1:饿汉式 1 /** 2 * 3 */ 4 package com.hlcui.singleton; 5 6 /** 7 * @author Administrator 饿汉式单例类 8 */ 9 public class SingletonDemo { 10 // 1:内部创建一个对象 11

IOS开发之单例设计模式

本文将从四个方面对IOS开发中的单例设计模式进行讲解: 一.什么是单例设计模式 二.我们为什么要用单例设计模式 三.单例设计模式的基本用法 四.自定义单例设计模式代码的封装 一.什么是单例设计模式 所谓单例,即是单个的实例化对象,保证一个类有且仅有一个实例.通常情况下,当我们对一个类实例化时(如:alloc.new等),并不能保证每次实例化的对象是唯一的实例.那么为了保证该类可在多次实例化的过程中保证内存地址不变,就需要引入单例设计模式. 二.我们为什么要用单例设计模式 1.Singleton

java设计模式_single(单例设计模式)

设计模式:解决某一类问题最行之有效的方法,java中有23种设计模式 一.单例设计模式概述: 1.解决一个类在内存中只有一个对象(保证一个类仅有一个实例,并提供一个访问他的全局访问点)  2.要保证对象的唯一: 1.为了避免其他程序过多的建立该类对象,先禁制其他程序建立该类对象 2.为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象 3.为了 方便其他程序对自定义对象的访问,可以对外提供一些访问方式 3.代码实现步骤: 1.将构造函数私有化 2.在类中创建一个本类对象 3.给外部提供

iOS常用设计模式——单例设计模式

单例设计模式详解 单例设计模式详解 基本概念 在IOS中使用单例模式的情况 非ARC环境创建单例模式的基本步骤 非ARC环境具体代码实现 ARC环境创建单例模式的基本步骤 基本概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问 在IOS中使用单例模式的情况 1.如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间 2.在IOS开发中,如果很多模