天天看点

Java设计模式之单例模式——饿汉式、懒汉式(初了解)Java设计模式之单例模式一、情景引入,单例模式——饿汉式二、单例模式——懒汉式饿汉式与懒汉式比较三、单例模式的优缺点与适应场景写在最后

Java设计模式之单例模式——饿汉式、懒汉式

  • Java设计模式之单例模式
  • 一、情景引入,单例模式——饿汉式
    • 饿汉式代码简单举例
  • 二、单例模式——懒汉式
    • 懒汉式代码简单举例
  • 饿汉式与懒汉式比较
  • 三、单例模式的优缺点与适应场景
    • 单例模式优点
    • 单例模式缺点
    • 单例模式适应场景
  • 写在最后

Java设计模式之单例模式

模式的由来: 模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案

目的: 为了可重用代码、让代码更容易被他人理解、提高代码可靠性(设计复用)

设计模式的基本要素:模式名称、问题、目的、解决方案、效果。实例代码和相关的设计模式

今天分享的单例模式是结构最简单的设计模式,核心结构中只包含一个被称为单例类的特殊类,对象创建型模式。

一、情景引入,单例模式——饿汉式

假设世界是一个系统程序,每一个人注定一辈子只能有一个女朋友且确定了,如果给每一个人都new一个对象的话,太占内存了,那么正好符合系统只需要一个实例对象,身为上帝的你,会这么处理这件事呢,如果没有思路请看下列代码

实现饿汉式:

1)构造器私有化 -> 防止直接new对象

2)类的内部创建对象

3) 向外暴露一个静态的公共方法getInstance

饿汉式代码简单举例

之所以叫做饿汉式,是因为在类中直接创建对象实例,“指腹为婚”的感觉,让人看着感觉很着急,说明就很饿。

ps:缺点之一在代码注释中哦`

package single;

public class SingleTon {
    public static void main(String[] args) {
        System.out.println(GirlFriend.age);
        System.out.println("==============");
        GirlFriend instance1 = GirlFriend.getInstance();
        System.out.println(instance1);
    }
}

class GirlFriend {
    /**
     * 1)构造器私有化 -> 防止直接new对象
     * 2)类的内部创建对象
     * 3) **==向外暴露一个静态的公共方法getInstance
     */
    private String name;
    public static int age = 18;
    private static GirlFriend gf = new GirlFriend("口罩没铝");
    private GirlFriend(String name) {
       /*作为提示信息,说明仅使用类中属性,构造体任然会被创建
        但是没有使用,实际情况中创建的对象可能就被jvm的销毁机制回收了,
        这就是实例内模式的缺点之一
        */
        System.out.println("构造器被调用...");
        this.name = name;
    }

    public static GirlFriend getInstance() {
        return gf;
    }

    @Override
    public String toString() {
        return "GirlFriend " +
                "name= " + name;
    }
}
           
Java设计模式之单例模式——饿汉式、懒汉式(初了解)Java设计模式之单例模式一、情景引入,单例模式——饿汉式二、单例模式——懒汉式饿汉式与懒汉式比较三、单例模式的优缺点与适应场景写在最后

二、单例模式——懒汉式

懒汉式是要使用对象时才会创建并调用构造器,注意这一点,所以叫懒汉

懒汉式代码简单举例

package single;

public class SingleTon2 {
    public static void main(String[] args) {
        System.out.println("不会创建对象,使用不会输出:构造器被调...");
        System.out.println(Cat.catage);
        System.out.println("=========");
        Cat instance1 = Cat.getInstance();
        System.out.println(instance1);
        System.out.println("===========");
        System.out.println("懒汉返回上次的对象属性,没有再次调用构造器");
        Cat instance2 = Cat.getInstance();
        System.out.println(instance2);

    }
}

class Cat {
    private String name;
    private static Cat cat;
    public static int catage = 3;
    //步骤
    //1.仍然构造器私有化
    //2.定义一个static静态属性对象
    //3.定义一个public的static方法,返回Cat对象
    private Cat(String name) {
        System.out.println("构造器被调用...");
        this.name = name;
    }
    public static Cat getInstance() {
        if(cat == null) { //如果没有创建cat对象
            cat = new Cat("nullcat");
        }
        return cat;
    }

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

           
Java设计模式之单例模式——饿汉式、懒汉式(初了解)Java设计模式之单例模式一、情景引入,单例模式——饿汉式二、单例模式——懒汉式饿汉式与懒汉式比较三、单例模式的优缺点与适应场景写在最后

饿汉式与懒汉式比较

Java设计模式之单例模式——饿汉式、懒汉式(初了解)Java设计模式之单例模式一、情景引入,单例模式——饿汉式二、单例模式——懒汉式饿汉式与懒汉式比较三、单例模式的优缺点与适应场景写在最后

三、单例模式的优缺点与适应场景

单例模式优点

1.提供了对唯一实例的受控访问

2.可以节约系统资源,提高系统的性能

单例模式缺点

缺点

1.扩展困难(缺少抽象层)

2.由于自动垃圾回收机制,可能会导致共享的单例对象的状态丢失

单例模式适应场景

1.系统只需要一个实例对象,或者因为资源消耗太大而叧允许创建

一个对象

2.客户调用类的单个实例只允许使用一个公共访问点,除了该公共

访问点,不能通过其他途径访问该实例。

写在最后

本人初学java 文章水平有限

蟹蟹 各位阅读

^ - ^