设计模式——单例模式

原创 2012年03月21日 20:09:09

单例模式:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。


但我们建立了一个简单的单例类后就可以在单例类中对要创建的对象进行自我创建,定向的向外界提供而不允许外界去创建。这样就可以实现对一些对象和资源的身份权限的验证和达到控制资源的目的。利用单例模式生成的对象是唯一的,确保外界多次引用的对象是同一个。对于一些占用资源较多的类有时候会使用单类模式,同时这个类也可能存在并发问题,所以可能会用到多线程进行控制访问。


建立Car类:

package com.lcq.factory;
 /**
  * 单例模式和工厂方法模式
  * @author lcq
  *
  */
 
 public class Car {
     //保证只能返回同一个对象
     private static Car car = new Car();
 
     /**
      * 将构造函数定义为私有的,不允许外部new
 */
     private Car() {
 
     }
 
     /**
      * 工厂方法
      * @return
 */
     public static Car getInstance() {
         return car;
     }
 
     public void run() {
         System.out.println("开车去东北。。。");
     }
 }

在Test客户类中进行测试:

package com.lcq.factory;
 
 public class Test {
     public static void main(String[] args) {
         Car car = Car.getInstance();
         Car car2 = Car.getInstance();
         //得到的car对象是同一个
         if (car == car2) {
             System.out.println("same car");
         }
         car.run();
 
     }
 
 }

上面的实例只是使用了new的方法进行对象的创建,同样也可以通过反射构造单例对象,或者通过序列化构造单例对象,但是其最终的用途是相同的。具体用哪种方法去实现可以根据具体情况而定。


以下是线程安全的单例类:

public class Singleton {
    private volatile static Singleton uniqueInstance;
 
    private Singleton() {
    }
 
    public static Singleton getInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

要点:

确保一个类只有一个实例,并提供一个全局访问点。

1)如何保证是单例,只有一个对象:
类中构造器是私有的,实例化只能类本身的方法调用构造器。

2)提供一个全局的方法获取实例化的单例对象:
使用静态static方法。

3)确保多线程中单例:
使用双重检查加锁。(volatile、synchronized)

单例模式类图:






版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式系列(一)单例模式

一、简单介绍 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。 《设计模式》书中对单例模式动机的介绍 对于系统中的某些类...
  • robertcpp
  • robertcpp
  • 2016年06月05日 11:00
  • 2232

C++设计模式[二]单例模式

接着就是单例模式;个人理解就是把创建方法改为私有,然后再内部实例化,禁止外部创建对象。 何为单例模式,在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:保证一个类只有一个实例,并提供一个...
  • langb2014
  • langb2014
  • 2015年11月03日 16:11
  • 1076

设计模式(创建型)之单例模式(Singleton Pattern)

单例模式可能是23种设计模式中最简单的。应用也非常广泛,譬如Android中的数据库访问等操作都可以运用单例模式。核心概念: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称...
  • yanbober
  • yanbober
  • 2015年04月27日 16:50
  • 2665

设计模式:单例模式(Singleton)

单例模式在23个设计模式中算得上是最简单的一个了,也行你会有异议,那就换成“最简单之一”,这样就严谨了很多。   单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。   适用性:当类...
  • u013256816
  • u013256816
  • 2016年03月23日 21:37
  • 4924

使用Object-C实现23种设计模式之单例模式

今天给大家讲解一下第四种创建模式——单例模式,单例模式不同于前几种,前几种更注重逻辑,而单例模式则偏重于内存管理以及实际运用,相对前几种要相对简单。 所谓单例模式,就是一种让某个类只产生单一实例的模式...
  • u013054715
  • u013054715
  • 2016年05月23日 22:43
  • 4397

浅谈常见设计模式--单例模式 简单工厂模式

今题那站在这里和大家一起分享最近在一本书上看到的关于设计模式的内容,接下来要讲的设计模式有: 单例模式 简单工厂模式 工厂方法和抽象工厂 代理模式 命令模式 策略模式 门面模式 桥接模式 观察者模式 ...
  • xikai18827083487
  • xikai18827083487
  • 2016年11月13日 17:04
  • 969

设计模式(二)单例模式的七种写法

面试的时候,问到许多年轻的Android开发他所会的设计模式是什么,基本上都会提到单例模式,但是对单例模式也是一知半解,在Android开发中我们经常会运用单例模式,所以我们还是要更了解单例模式才对。...
  • itachi85
  • itachi85
  • 2016年01月17日 10:29
  • 24241

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了...
  • u013472838
  • u013472838
  • 2015年04月02日 15:01
  • 706

大话设计模式——单例模式

宏观导图 细节展示  单例模式的结构图: 关键代码:  在GetInstance方法中,要加入判断。 if (instance==null) { instance=new Single...
  • u011500356
  • u011500356
  • 2015年01月05日 21:44
  • 1464

C++设计模式5--单例模式Singleton--当前对象只有一个实例

很多情况下,我们在开发项目的过程中,都希望自己运行的某个部件只有一个实例, 比如我们天天用QT开发界面,QTCreate里帮助菜单下的关于Qt Create菜单,弹出来的关于对话框,在QTCreate...
  • gatieme
  • gatieme
  • 2014年01月08日 13:25
  • 21467
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式——单例模式
举报原因:
原因补充:

(最多只允许输入30个字)