Java设计模式之单例模式(1)

第一次写设计模式,如果写错了,请指正,虚心学习,一起进步

什么是设计模式?

  • 定义:

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。

  • 简单来说:

在某些场景下,针对某类问题的某种通用的解决方案。
1.场景:项目所在的环境
2.问题:约束条件,项目目标等
3.解决方案:通用、可复用的设计,解决约束达到目标。

设计模式有哪些分类?

类型说明
创建型模式对象实例化的模式,创建型模式用于解耦对象的实例化过程。
结构性模式把类和对象结合起来构建成一个更大的结构
行为型模式类和对象如何交互,及划分责任和算法。

1.单例模式

  • 什么是单例模式

创建一个类,该类只有一个实例对象,提供一个全局的访问点,这样可以避免资源的浪费

  • 如何实现一个类只有一个实例对象呢?我们使用代码来解说
class Singleton{
    //1.构造方法私有化,这样就无法直接通过new关键字来实例化对象了
    private Singleton(){

    }
    private static Singleton singleton=new Singleton();//2.定义一个静态变量,实现只有一个
    //3.提供方法获取对象实例
    public static Singleton getIntacne(){
        return singleton;
    }

}
  • 单例模式中的饿汉式和懒汉式
  • 饿汉式
    1.我们直接从翻译来的字面意思理解一下,因为名字可以代表一些思想.饥饿说明一个人饿的很着急,急需食物,碰到食物就会吃,所以其核心当我们获取单例对象时,直接返回一个对象实例,只要调用getIntacne()方法就返回实例对象,下面是代码:
class SingletonHunger{
    //1.构造方法私有化
    private SingletonHunger(){

    }
    private static SingletonHunger singletonHunger=new SingletonHunger();

    public static SingletonHunger getIntacne(){
        return singletonHunger;
    }

}
  • 懒汉式
    1.也是直接从名字来解释一波,就一个字,那怎么样才可以让程序懒呢?当调用方法获取实例对象时,我们会先判断实例对象是否为null,如果是null,那么创建一个实例对象返回,如果有了,那就直接返回已经有的实例对象,类似有了我就懒的创建了,直接返回就行了,代码实现:
class SingletonLazy{
    //1.构造方法私有化
    private SingletonLazy(){

    }
    private static SingletonLazy singletonLazy=null;

    public static SingletonLazy getIntacne(){
        if (singletonLazy==null){
            singletonLazy=new SingletonLazy();
        }
        return singletonLazy;
    }

}

2.懒汉式是线程不安全的,因为当多线程时会创建多个实例对象,我们来说明一下:
线程A调用getIntacne()方法时,首先判断null,结束后,此时因为种种原因,阻塞了,OK,这个时候线程B开始执行了,也是先判断null,然后发现为null,创建了一个实例对象,此时线程A阻塞状态结束,开始执行,又会创建一个实例对象,所以针对这个bug,我们可以加同步锁:改进代码:

class SingletonLazy{
    //1.构造方法私有化
    private SingletonLazy(){

    }
    private static SingletonLazy singletonLazy=null;

    public static synchronized SingletonLazy getIntacne(){
        if (singletonLazy==null){
            singletonLazy=new SingletonLazy();
        }
        return singletonLazy;
    }

}

总结:

懒汉式饿汉式
时间换空间空间换时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值