首页 > 其他分享 >单例设计模式(懒汉式or饿汉式)

单例设计模式(懒汉式or饿汉式)

时间:2022-10-01 18:46:21浏览次数:38  
标签:饿汉 Cat static 单例 GirlFriend 设计模式 name

1 什么是设计模式

  1. 静态方法和属性的经典使用
  2. 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索.

2 什么是单例模式

单例:单个实例

  1. 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
  2. 单例模式有两种方式:1)饿汉式 2)懒汉式;

(保证某一个只能有一个实例,不可以再有第二个实例,比如某一个非常重要的核心类,只使用一次)

3 单例设计模式-饿汉式

步骤如下:

  1. 构造器私有化(防止用户直接去new)
  2. 类的内部创建对象;
  3. 向外暴露一个静态的公共方法。getInstance()

饿汉式:只要类加载,类的属性就创建了,你还没用到呢。很着急!!!!

那么,很自然的想到,饿汉式单例模式会造成资源的浪费

public class SingleTon01 {

    public static void main(String[] args) {
//        GirlFriend xh = new GirlFriend("小红");
//        GirlFriend xb = new GirlFriend("小白");

        //通过方法可以获取对象
        GirlFriend instance = GirlFriend.getInstance();
        System.out.println(instance);

        GirlFriend instance2 = GirlFriend.getInstance();
        System.out.println(instance2);

        System.out.println(instance == instance2);//T
        //System.out.println(GirlFriend.n1);

        //...


    }

}

//有一个类, GirlFriend
//只能有一个女朋友
class GirlFriend {

    private String name;
    //public static  int n1 = 100;
    //为了能够在静态方法中,返回 gf对象,需要将其修饰为static
    //對象,通常是重量級的對象, 餓漢式可能造成創建了對象,但是沒有使用.
    private static GirlFriend gf = new GirlFriend("小红红");

    //如何保障我们只能创建一个 GirlFriend 对象
    //步骤[单例模式-饿汉式]
    //1. 将构造器私有化
    //2. 在类的内部直接创建对象(该对象是static)
    //3. 提供一个公共的static方法,返回 gf对象
    private GirlFriend(String name) {
        System.out.println("構造器被調用.");
        this.name = name;
    }

    public static GirlFriend getInstance() {
        return gf;

    }

    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}

3 单例设计模式-懒汉式

存在线程安全问题

package com.yt.singleinstance;

public class SingleTest02 {
    public static void main(String[] args) {
        Cat instance = Cat.getInstance();
        System.out.println(instance);//1540e19d

        Cat instance1 = Cat.getInstance();
        System.out.println(instance1);//1540e19d

    }
}
//希望在程序运行的时候只能创建一个对象
//使用单例模式
class Cat{
    private String name;
    private static Cat cat;//默认值为null

    //步骤:
    //1.将类的构造器私有化
    //2.定义一个类属性对象,如果是饿汉式就直接new一个对象
    //3.定义一个public的静态static方法,返回类对象,
    //  懒汉式,在调用时再创建类对象
    private Cat(String name) {
        this.name = name;
    }

    public static Cat getInstance(){
        if (cat == null){
            //如果还没有就创建cat对象,需要时再用
            cat = new Cat("xiaomiaomiao");
        }
        return cat;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                '}';
    }
}

4 饿汉式 VS 懒汉式

  1. 二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建。
  2. 饿汉式不存在线程安全问题,懒汉式存在线程安全问题。(后面学习线程后,会完善一把)
  3. 饿汉式存在浪费资源的可能。因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题。
  4. 在我们javaSE标准类中,java.lang.Runtime就是经典的单例模式。(饿汉式单例模式)

1664618336694

标签:饿汉,Cat,static,单例,GirlFriend,设计模式,name
From: https://www.cnblogs.com/y-tao/p/16747566.html

相关文章

  • 设计模式 —— 单例模式
    6单例模式6.1单例模式概述SingletonPatter:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。单例模式有3个要点:该类只能有一个实例该类必须自......
  • 设计模式---工厂方法模式
    简述类型:创建型目的:实现对客户端中对象的平替。我们借以下案例来说说如何使用工厂方法模式平替对象。优化案例最初版publicinterfaceOS{publicvoids......
  • 26.单例模式
    程序1:#pragmawarning(disable:4996)//2022年9月30日20:00:15#include<iostream>usingnamespacestd;//单例模式是一个类只能实例化一个对象classMaker{/......
  • 单例模式
    单例分为饿汉式和懒汉式在初始化单例唯一指针的时候,就已经提前开辟好了一个对象,申请了内存。饿汉式的好处是,不会出现线程并发创建,导致多个单例的出现,但是缺点是如果这个......
  • 设计模式之访问者模式
    大多数情况下你不需要访问者模式,但当一旦需要访问者模式时,那就是真的需要它了,这是设计模式创始人的原话。可以看出应用场景比较少,但需要它的时候是不可或缺的,这篇文章就开......
  • 初识设计模式 - 适配器模式
    适配器在生活中经常见到,如手机、笔记本电脑的电源适配器,USB转接头都是常见的适配器。在设计模式当中,适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。在类......
  • 【转载】模式——使用MVVM设计模式的WPF程序开发
    原文:模式-具有模型-视图-视图模型设计模式|的WPF应用微软学习(microsoft.com)翻译:https://blog.csdn.net/weixin_37537723/article/details/106916294说明本文是笔......
  • 设计模式的七大原则
    设计模式之七大编程原则单一职责原则接口隔离原则依赖倒转原则里氏替换原则迪米特法则合成复用原则笔记总结来源于B站:B站尚硅谷——Java设计模式一、单一职责原......
  • 【设计模式】29.结构型模式-装饰模式(Decorator)
    一、描述装饰模式能够在不改变原来对象结构和功能的前提下,动态的给对象增加新的功能,相比于使用子类扩展的方式,装饰模式更加的灵活。角色(1)抽象构件类:为具体构件类和装饰......
  • 行为型设计模式之观察者模式
    观察者模式观察者模式,又叫发布-订阅模式,它属于行为型模式。它是定义一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听,使得每当主题对象状态变化时,所有依赖于......