`
linxingliang
  • 浏览: 6833 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

大话设计模式--Singleton(单例模式)

阅读更多

 

 

大话设计模式--Singleton(单例模式)

——Angel

 

目录

1.什么是Singleton – 单例模式... 1

2. 非Singleton例子... 2

3. Singleton例子... 5

4.为什么需要Singleton. 8

 

 

说明:

1>    开发工具Eclipse

2>    开发平台Window Xp

3>    有问题可联系本人 QQ412887952

 

1.什么是Singleton – 单例模式

我有6个漂亮的老婆,她们的老公都是我,我就是我们家的singleton,她们只要说道老公,都是指同一个人,那就是我。

(哎,哪有那么好的事呀,除非做梦了。)

   笑够了就得回来了。我们的目标还是学习,当然咱们学习讲究乐中学,学中乐,最终是快乐成长。我们回头看看这个笑话:

【我】就是程序中的一个【类】

【我的6个老婆】就是程序中的“我”的6个实例。(平时我们都是用new 实例化对象,当然用这种方式构造出来的对象,那就不是我同一个对象了,回到例子的话,也就是说,我的6个漂亮老婆就不是我了,是其他对应的6个人了,嘎嘎,啊啊,我不要这样呀,我要我的老婆呀。)

【同一个人,都是我】就是程序用的同一个对象,从内存来看的话就是地址相等。(等下我们用程序证明:我们获取的对象都是同一个对象。)

 

 

从上面可以看出所谓的单例:就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

更多资料:http://baike.baidu.com/view/1859857.htm

 

 

2. Singleton例子

   在学习Singleton模式之前,我们先看看以前普通的java类。

现在让我们一起创建一个  “我的类”,类名为Angel (这个是我的QQ昵称,所以这么命名呀。),在此类中提供一个方法,比如 loveMyWife (“我爱我的6个老婆“)

Angel.java代码如下:

package singleton_001;

 

 

/**

 * 自己的一个类

 * @author Administrator

 *

 */

public class Angel {

    public void loveMyWife(){

       System.out.println("我爱我的老婆,我的6个老婆都是我的呀,不允许公用!");

    }

}

说明:这个类没有太多的知识点,仅是普普通通的一个类,类中有一个简单的方法,方法中输出一句话。

我们在写一个测试类,来测试我们的程序,类名为 TestAngel.java

TestAngel.java代码如下:

package singleton_001;

 

public class TestAngel {

   

    /** main方法启动程序*/

    public static void main(String[] args) {

       Angel myWife = new Angel();//假设这个是真正的老婆

       Angel myWife1 = new Angel();// 我的第一个老婆

       Angel myWife2 = new Angel();// 我的第二个老婆

       Angel myWife3 = new Angel();// 我的第三个老婆

       Angel myWife4 = new Angel();// 我的第四个老婆

       Angel myWife5 = new Angel();// 我的第五个老婆

       Angel myWife6 = new Angel();// 我的第六个老婆

       /*我们通过比较对象的对象是否相同,来判定是否同一个实例*/

       if(myWife == myWife1){//相等的时候

           System.out.println("老婆1说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆1说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

      

       if(myWife == myWife2){//相等的时候

           System.out.println("老婆2说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆2说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

      

       if(myWife == myWife3){//相等的时候

           System.out.println("老婆3说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆3说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

      

      

       if(myWife == myWife4){//相等的时候

           System.out.println("老婆4说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆4说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

      

       if(myWife == myWife5){//相等的时候

           System.out.println("老婆5说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆5说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

      

       if(myWife == myWife6){//相等的时候

           System.out.println("老婆6说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆6说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

    }

}

说明:这个类看是代码特别多,但是提取出重要代码的话,就一句话:

new if (初始化对象,判断对象是否是同一个对象。)

 

运行代码,结果如下:

老婆1说:你不是我的老公,走开了呀!

我说:啊,不要,我要你做我的老婆

老婆2说:你不是我的老公,走开了呀!

我说:啊,不要,我要你做我的老婆

老婆3说:你不是我的老公,走开了呀!

我说:啊,不要,我要你做我的老婆

老婆4说:你不是我的老公,走开了呀!

我说:啊,不要,我要你做我的老婆

老婆5说:你不是我的老公,走开了呀!

我说:啊,不要,我要你做我的老婆

老婆6说:你不是我的老公,走开了呀!

我说:啊,不要,我要你做我的老婆

 

结果分析:

通过代码我们发现,这种方式的对象都是不相等的。(嘎嘎,没有一个是我的老婆呀,不做我老婆做我小妾也可以呀。)

 

3. Single例子

   接下来我们看看单例的例子。我们来修改下我们之前的代码.

观察我们的代码,我们发现我们的每一个实例都是通过new的方式进行生产的,我们知道通过new产生的对象就会在计算机内存开辟一个内存空间,所以肯定不是同一个对象。现在我们要让实例化的对象都是一样的,也就是说这个对象的产生,我们自己控制,不允许他人用new的方式进行构造,所以第一步我们需要把无参构造方法给屏蔽掉,也就是重写无参构造方法,将该方法改成私有的。改完之后,我们会发现我们根本就得不到我们的实例,那怎么办呢,我们通过一个静态方法来构造对象。代码体现如下:

Angel.java代码:

package singleton_002;

 

 

/**

 * 自己的一个类

 * @author Administrator

 *

 */

public class Angel {

   

    /*该类对象,用静态变量,确保只在内存开辟一个内存空间*/

    private static Angel instance;

   

    /**将该类的构造方法屏蔽*/

    private Angel(){};

   

    /**提供获取该类的实例*/

    public static Angel getInstance(){

       if(instance == null){

           synchronized (Angel.class) {//锁住当前类,防止两个线程同时访问

              instance = new Angel();

           }

       }

       return instance;

    }

   

    public void loveMyWife(){

       System.out.println("我爱我的老婆,我的6个老婆都是我的呀,不允许公用!");

    }

}

TestAngel.java代码:

package singleton_002;

 

import java.io.ObjectInputStream.GetField;

 

public class TestAngel {

   

    /** main方法启动程序*/

    public static void main(String[] args) {

       Angel myWife = Angel.getInstance();//假设这个是真正的老婆

       Angel myWife1 = Angel.getInstance();// 我的第一个老婆

       Angel myWife2 = Angel.getInstance();// 我的第二个老婆

       Angel myWife3 = Angel.getInstance();// 我的第三个老婆

       Angel myWife4 = Angel.getInstance();// 我的第四个老婆

       Angel myWife5 = Angel.getInstance();// 我的第五个老婆

       Angel myWife6 = Angel.getInstance();// 我的第六个老婆

       /*我们通过比较对象的对象是否相同,来判定是否同一个实例*/

       if(myWife == myWife1){//相等的时候

           System.out.println("老婆1说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆1说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

      

       if(myWife == myWife2){//相等的时候

           System.out.println("老婆2说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆2说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

      

       if(myWife == myWife3){//相等的时候

           System.out.println("老婆3说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆3说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

      

      

       if(myWife == myWife4){//相等的时候

           System.out.println("老婆4说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆4说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

      

       if(myWife == myWife5){//相等的时候

           System.out.println("老婆5说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆5说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

      

       if(myWife == myWife6){//相等的时候

           System.out.println("老婆6说:老公我爱你,你永远是我的好老公");

           System.out.println("我说:都是我的好老婆....");

          

       }else {//不相等的时候

           System.out.println("老婆6说:你不是我的老公,走开了呀!");

           System.out.println("我说:啊,不要,我要你做我的老婆");

       }

       

    }

}

运行代码结果如下:

老婆1说:老公我爱你,你永远是我的好老公

我说:都是我的好老婆....

老婆2说:老公我爱你,你永远是我的好老公

我说:都是我的好老婆....

老婆3说:老公我爱你,你永远是我的好老公

我说:都是我的好老婆....

老婆4说:老公我爱你,你永远是我的好老公

我说:都是我的好老婆....

老婆5说:老公我爱你,你永远是我的好老公

我说:都是我的好老婆....

老婆6说:老公我爱你,你永远是我的好老公

我说:都是我的好老婆....

结果分析:

从上面代码我们发现,我们所构造的每一个对象都是同一个实例。

(嘎嘎,都是我的老婆呀。)

 

4.为什么需要Singleton

   刚接触单例的人肯定都会有和我相同的疑问:为什么我们需要单例。有人肯定会说:单例可以减少内存空间的开辟。这个说法没有错,但是这不是单例存在的实质。单例存在的实质主要是:

数据共享——可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。比如,数据库连接池的设计一般采用单例模式,数据库连接是一种数据库资源;控制资源的使用,通过线程同步来控制资源的并发访问;控制实例产生的数量,达到节约资源的目的。

 

5. Singleton使用场景

简而言之,就是任何只需要一个实例的地方.例如,窗口管理器,假脱机打印设备,数据库连接池。具体应用中,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类.

1)读取配置文件的类:比如你的工程需要读取配置文件,一般情况下你会写个配置文件的类,而这个类在整个工程里只需要new一次,所有调用者都是用同一个实例,那么这个类就可以采用单例模式。

2)管理器的类:一些管理器的类都是单例的,所有跟管理有关的操做都要调用管理器来进行,管理器不能出现多个,所以要单例,避免管理混乱。

3)日志操作类:你如果多个实例打开同一个文件写日志,那肯定是不行的(当然,如果你非要多个实例之间做同步,打开文件,写,关,然后下一个实例,这种,那性能就不行了)。

4)配置信息类:负责配置文件的解析,通常被设计为单例类。

5)管理类:如连接池管理类,通常被设计为单例类。

6)控制类:如strutsActionServlet类,也是单例类。

7)门面类:说到门面类,就不能不提门面(Facade)模式。客户端与多个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。这个统一的门面(Facade)对象就是门面类。在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。但这不是绝对的。

8)代理类:在Jive中,使用代理模式实现权限访问的入口,就采用了单例模式。

 

 

 

0
1
分享到:
评论

相关推荐

    java设计模式----单例模式

    总的来说,单例模式的设计旨在提供对唯一实例的受控访问,饿汉模式和懒汉模式分别代表了初始化策略的不同选择,开发者需要根据具体需求平衡初始化时机和线程安全的需求。在实际开发中,还可以使用枚举类型的单例,这...

    Java面向对象(高级)- 单例(Singleton)设计模式

    单例设计模式是面向对象编程中的一种常见设计模式,它的主要目的是确保一个类在整个程序运行期间只有一个实例,并提供全局访问点。这种模式在Java中被广泛应用,尤其是在需要控制资源的共享,如数据库连接池,线程池...

    ava常用设计模式-单例模式

    ava常用设计模式-单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一...

    Java设计模式-单例模式详解

    Java设计模式-单例模式详解 单例模式是 Java 设计模式中的一种常用的设计模式,旨在保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的目的是为了保证在一个进程中,某个类有且仅有一个实例。 ...

    常见设计模式-单例模式

    设计模式-单例模式 单例模式是一种常见的设计模式,它的主要作用是确保在内存中仅创建一次对象,并提供一个全局访问点。单例模式有两种类型:饿汉类型和懒汉类型。 饿汉类型的单例模式是在类加载时创建对象,例如...

    设计模式-单例模式

    **设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...

    设计模式--单例模式java例子

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于可以控制实例的数量,减少资源消耗,同时便于协调整个...

    设计模式-单例设计模式

    ### 设计模式—单例设计模式详解 #### 定义 单例模式是一种常见的创建型设计模式,其核心思想在于确保一个类仅有一个实例存在,并且该实例由该类自行创建,随后向整个系统提供这一唯一实例。 #### 类图解析 在设计...

    Qt qml Singleton 单例模式

    在Qt的Qml环境中,单例模式是一种设计模式,它允许在整个应用程序中创建一个全局访问点,确保某个类只有一个实例存在。这样的设计模式在需要共享数据或者服务时非常有用,避免了多处创建相同对象导致的数据不一致或...

    设计模式-单例模式(讲解及其实现代码)

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供全局访问点。这种模式在许多场景下非常有用,比如控制共享资源、管理系统级别的对象,如数据库连接池或者线程池等。单例模式的核心在于限制类的...

    PHP5设计模式-单例模式

    单例模式是一种常用的设计模式,它在软件工程中扮演着控制类实例化过程的角色,确保一个类只有一个实例,并提供全局访问点。这种模式在PHP中尤其常见,特别是在需要频繁实例化然后销毁的对象,或者需要控制共享资源...

    c++设计模式-单例模式

    **单例模式**是软件设计模式中的一种,属于创建型模式。在C++中,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源,如数据库连接、日志系统或者配置文件等。单例模式的主要...

    Java-设计模式-单例模式-实现源码(简单实现、双重检查锁、静态内部类、枚举类)

    单例模式是软件设计模式中的一种经典模式,其主要目的是保证一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方法,包括简单实现、双重检查锁定(Double-Checked Locking)、静态内部类和...

    java设计模式-单例.pdf

    ### Java设计模式——单例模式详解 #### 一、单例模式概述 单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景...

    设计模式专题之(一)单例模式---设计模式单例模式模式示例代码(python--c++)

    单例模式是软件设计模式中的一种基础且广泛应用的模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在资源管理、配置对象、缓存等场景下非常常见,因为它可以避免因频繁创建和销毁对象而...

    C++设计模式--基于Qt4开源跨平台开发框架

    创建型模式如单例模式(Singleton)、工厂模式(Factory Method)和抽象工厂模式(Abstract Factory),主要关注对象的创建过程,旨在减少类之间的耦合度。结构型模式如适配器模式(Adapter)、装饰器模式...

    PyPI 官网下载 | dask-actor-singleton-1.1.0.tar.gz

    综上所述,`dask-actor-singleton-1.1.0.tar.gz`是一个与Dask相关的Python软件包,它针对分布式系统中的单例模式进行了优化,可能整合了Zookeeper来实现更高级别的协调,同时也符合云原生的开发原则。如果你在处理...

    设计模式-Java单例模式的各种实现实例

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。这种模式通常用于需要频繁地创建和销毁的对象,以减少系统性能开销。 单例模式的优点: ...

Global site tag (gtag.js) - Google Analytics