`
blackchocolate
  • 浏览: 24815 次
  • 性别: Icon_minigender_2
  • 来自: 重庆
社区版块
存档分类
最新评论

理解单例模式、单例类

    博客分类:
  • java
阅读更多
  在大部分时候,我们把类的构造器定义成public访问权限,允许任何类自由创建该类的对象。但是在某些时候,允许其他类自由创建该类的对象没有任何意义,还可能造成系统性能下降(因为创建一个对象的系统开销问题)。例如系统可能只有一个窗口管理器,一个假脱机打印设备或一个数据库引擎访问点,此时如果在系统中为这些类创建多个对象就没有太大的事迹意义。
  如果一个类始终只能创建一个实例,则这个类被称为单例类。
  总之,在一些特殊场景下,要求不允许自由创建该类的对象,而是只允许为该类创建一个对象。为避免其他类自由创建该类的实例,我们把该类的构造器使用private修饰,从而把该类的所有构造器隐藏起来。
  根据良好的封装的原则:一旦把该类的构造器隐藏起来,则需要提供一个public方法作为该类的访问点,用于创建该类的对象,且该方法必须使用static修饰(因为调用该方法之前还不存在对象,因此调用该方法的不可能是对象,只能是类)。
  除此之外,该类还必须缓存已经创建的对象,否则改类无法知道是否曾将创建过对象,也就无法保证值创建一个对象。为此改类需要使用一个属性来保存曾经创建的对象,因为该属性需要被上面的静态方法访问,故此属性必须使用static修饰。
  基于上面的介绍,下面是例子:

class Singleton(
   //使用一个变量来缓存曾经创建的实例
   private static Singleton instance;
   private Singleton(){}
   public static Singleton getInstance(){
     if (instance == null)
       {
        instance = new Singleton();
        }
      return instance;
  }
)
public class TestSingleton{
   public static void main(String[] args)
   {
      singleton s1 = Singleton.getIncetance();
      singleton s2 = Singleton.getIncetance();
     //将输出true
      System.out.println(s1==s2);
   }
}



第二种方法:
public class Singleton {
  //在自己内部定义自己的一个实例,只供内部调用
  private static Singleton instance = new Singleton();
  private Singleton(){
  //do something
  }
  //这里提供了一个供外部访问本class的静态方法,可以直接访问
  public static Singleton getInstance(){
  return instance;
  }
  }




第三种方法:
 public class Singleton {
  private static Singleton instance = null;
  private Singleton(){
  //do something
  }
  public static Singleton getInstance(){
  if(instance==null){
  synchornized(Singleton.class){
  if(null == instance){
  instance = new Singleton();
  }
  }
  }
  return instance;
  }
  }//这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
分享到:
评论

相关推荐

    单例模式实现mdi界面子窗体控制

    首先向关注过我这个系列...这立刻让我想到了最常用也是最简单最容易理解的一个设计模式 单例模式 何为 单例模式 ? 故名思议 即 让 类 永远都只能有一个实例。 由于 示例代码 比较简单 我也加了注释,这里就不在赘述

    Java单例模式深入理解

    不同单例模式的详细讲解,了解使用单例的最佳方式。

    C++中的单例模式及按需释放模型

    单例模式是设计模式中最简单最容易理解的模式之一,实用方便,项目设计开发中会被经常使用,但是不知道读者有没有考虑过这个问题,单例模式实例什么时候被释放,读者有兴趣可以仔细分析下,按照目前通常方法实现的...

    单例模式讲解案例

    单例模式的简单了解文档,以及代码中怎么使用单例模式。

    单例模式与装饰着模式.md

    通过学习java 简单总结单例模式与装饰者模式,做一下入门总结,主要讲述单例模式中饿汉式与懒汉式的相同点与不同点,方便理解记忆。

    单例模式的详细讲解

    这个文档详细的讲解了单例模式,通俗易懂,里面包含的一个简单例子更是有利于理解,希望对大家有用

    单例模式举例

    本代码有利于java初学者理解单例模式很好地例子。我初学时这个例子帮老大忙了,贡献给大家

    单例模式代码和文档

    单例模式的练习代码和文档,可以帮助理解单例模式。

    耦合和单例模式的理解

    1. 高内聚和低耦合:2. 单例模式和工厂模式:

    举例讲解C#编程中对设计模式中的单例模式的运用

    为了帮助大家更好地理解单例模式,大家可以结合下面的类图来进行理解,以及后面也会剖析单例模式的实现思路: 为什么会有单例模式 看完单例模式的介绍,自然大家都会有这样一个疑问——为什么要有单例模式的?它在什么...

    C#单例模式源码

    帮助你充分理解单例模式,非常好理解的模型,下载下来试试看吧,不需要积分。

    JavaScript设计模式之单例模式.md

    为了帮助大家快速和较好地理解JavaScript设计模式中的单例模式,本文对JavaScript的单例模式进行了分析并进行简易的代码演示,希望本文能够给有需要的人带来一点小小的帮助。

    imaxue#progress#单例模式1

    单例模式保证某一个类只有一个实例存在简单的单例模式// 这是一个简单的单例模式可以理解一下意义所在,但是是有缺点的var Singleton = functio

    Java的单例设计模式

    简单的单例模式,帮助大家理解代码,主要是用纯java写的。

    Java聊天室 观察者模式和单例模式

    基于观察者模式和单例模式的java聊天室 面向对象设计,抽象,封装,代理,组合和继承 适合理解java面向对象,socket编程,观察者模式和单例模式

    java设计模式–单例模式推理过程

    java 设计模式–单例模式推理过程 设计模式(全名:软件设计模式),是一套反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性...

    最全的单例模式j(java实现),下到就是赚到!

    最近在学习多线程相关知识,同时加深了对单例的理解,从并发的角度学习到了不同的单列模式,提供出来供大家一起学习

    C#设计模式–单例模式

    一、引言  近在学设计模式的一些...,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也是保证一个类只有一个实例的一种实现方法罢了(设计模式其实是帮助我们解决实际开发过程中的方法, 该方法是

    多线程并发下的单例模式-源码

    该资源是多线程并发下的单例模式-源码,几乎包含了所有方式实现的单例模式,并且能够确保...读者可结合本人博客 http://blog.csdn.net/cselmu9?viewmode=list 中的《线程并发之单例模式(最全最经典)》一文加以理解。

    C# 设计模式系列教程-单例模式

     对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再...

Global site tag (gtag.js) - Google Analytics