黑马程序员技术交流社区

标题: 【黑马程序员济南】浅谈设计模式-单例设计模式 [打印本页]

作者: 小鲁哥哥    时间: 2017-11-23 17:30
标题: 【黑马程序员济南】浅谈设计模式-单例设计模式
【黑马程序员济南】单例设计模式

我们一般在学习的第一个设计模式都是单例设计模式,因为单例设计模式广泛的应用在我们程序开发中。黑马程序员济南校区的小鲁哥哥从今天就和大家简单的聊一聊设计模式的那些事,不专业仅是个人观点。
我们今天就先聊一聊单例设计模式,因为在我们刚开始学习Java基础时,就了解了单例,有的同学在学习时非常困惑,不明白什么是单例,不明白在什么场景下会用到单例设计模式。
我们先说一下单例的概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
通过概念我们可以简单的知道,所谓的单例模式就是保证我们定义的类在我们的程序中只能new出一个对像(实例)。在一些特定情况下,我们只允许类只能实例化一次,这种情况下我们就需要用到了单例设计模式。
说了这么多,我们写一个初级的单例给大家展示一下:
[Java] 纯文本查看 复制代码
Class Single
{
private static Single instance;
Private Singleton(){}
Public static Single getInstance(){
If(instance == null){
Instance = new Single();
}
Return instance;
}
}
大家可以看到,我们是如何保证这个类只能被实例化一次的,首先1、我们对它的构造函数进行私有化,确保外部的类不能对他进行实例化。2、提供一个静态方法来获取当前类对象。
如果外部类想访问这个类对象,我们可以通过类名.getInstance()的方法来获取Single的类对象。
单例设计模式又分为两种,饱汉式和饿汉式。
饱汉式:
[Java] 纯文本查看 复制代码
package com.lxk.designPattern.singleton;  
  
/**
* 饱汉式(懒汉式)----就是有钱,豪,用的时候再new(线程不安全)
* <p>
* Created by lxk on 2017/3/23
*/  
public class Single1 {  
    //这个就不能加final,因为要在其他地方给他再次赋值呢。  
    //加了final,那就默认一直是null啦,而且还不能再次给此属性赋值。  
//此属性是静态,那么就是共享数据,多线程并发操作共享数据是有可能的。那么就会出现下面的线程不安全现象。  
Priavte Single1
    private static Single1 SingleInstance;  
  
    private Singlet1() {  
    }  
  
    public static Single1 getSingleInstance() {  
        if (SingleInstance == null) {  
            //在这个地方,多线程的时候,  
            //可能A线程挂起,此属性还是null,那么B线程可能也判断条件OK也进来啦。  
            //然后A线程可以执行的时候就会new个对象,线程B也会new个对象。  
            //就不能保证内存的唯一性。也就是线程不安全  
            SingleInstance = new Single1();  
        }  
        return SingleInstance;  
}
饿汉式:
[Java] 纯文本查看 复制代码
public class Single2 {  
    //有的会加final修饰符(更为严谨),添加final修饰符之后,指向的引用不能再做更改。  
    //这是final的用法:final成员变量表示常量,只能被赋值一次,赋值后值不能再改变。  
    //这句话得这么理解:  
    //对于一个final变量。  
    // 如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;  
    // 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。  
    private static final Single2 SingleInstance = new Single2();  
  
    private Single2() {  
    }  
  
    public static Single2 getSingleInstance() {  
        return SingleInstance;  
    }  
}
这两种方式有什么区别呢,我们在这里留一个悬念,大家看完后自己想一想,我们下一篇在给大家答案。
【黑马程序员济南】小鲁哥哥全学科技术整合帖(一贴在手!天下我有!)
如果你想了解更多黑马课程,如果你想加入黑马这个大家庭学习先进技术,光交天下好友,那就快来吧!
     黑马程序员济南中心联系电话:0531-55696830







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2