美文网首页
7.设计模式

7.设计模式

作者: 星野君 | 来源:发表于2022-04-26 11:26 被阅读0次

一、单例模式
单例模式就是确保某个类只有一个实例,并且该类只提供一个获取其对象实例的方式。分为饿汉式和懒汉式。

饿汉式实现步骤:

  1. 构造器私有化
  2. 类的内部创建对象
  3. 向外部暴露一个静态公共方法
public class Home {
  public static void main(String[] args) {
    Girl girl = Girl.getInstance();
  }
}

class Girl {
  private String name;
  //在类的内部创建这个类的实例
  private static Girl girl = new Girl("name");
  //构造器私有化
  private Girl(String name) {
    this.name = name;
  }
  //创建一个返回对象的公共方法
  public static Girl getInstance() {
    return girl;
  }
}

懒汉式实现步骤:

  1. 仍然構造器私有化
  2. 定義一個 static 靜態屬性對象
  3. 提供一個 public 的 static 方法,可以返回一個 Girl對象
  4. 懶漢式,只有當用戶使用 getGirl 時,才返回 Girl對象, 後面再次調用時,會返回上次創建的 Girl對象
public class Home {
  public static void main(String[] args) {
    Girl girl = Girl.getInstance();
  }
}

class Girl {
  private String name;
  // 定义静态属性对象,默认是null
  private static Girl girl;

  private Girl(String name) {
    this.name = name;
  }

  public static Girl getInstance() {
    // 只有第一次调用的时候去创建Girl对象实例
    if (girl == null) {
      girl = new Girl("name");
    }

    return girl;
  }
}

但是懒汉式存在线程安全问题,想要解决只要在方法加上synchronized即可。

public static synchronized Girl getInstance() {

加上synchronized的话又会导致效率低下,使用双重检查改进:

  public static Girl getInstance() {
    // 只有第一次调用的时候去创建Girl对象实例
    if (girl == null) {
      synchronized (Girl.class) {
        if (girl == null) {
          girl = new Girl("name");
        }
      }
    }
    return girl;
  }

Double-Check概念对于多线程开发者来说不会陌生,如代码中所示,我们进行了两次if (girl == null)检查,这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断if (girl == null),直接return实例化对象。
优点:线程安全;延迟加载;效率较高。

饿汉式和懒汉式区别:

  1. 两者最重要的区别是创建对象实例的时机不同,饿汉式是在类加载的时候就创建了对象,而懒汉式是在使用时才会去创建。
  2. 饿汉式不存在线程安全问题,而懒汉式存在线程安全问题
  3. 饿汉式存在资源浪费问题,饿汉式没有去使用这个对象实例的话,那这个对象就浪费了,而懒汉式是使用的时候才创建所以不存在这个问题。
  4. java.lang.Runtime 就是经典的单例模式

二、抽象类-模板设计模式

  public class AA extends Template {
    // 计算任务
    // 1+....+ 800000
    @Override
    public void job() { // 实现 Template 的抽象方法 job
      long num = 0;
      for (long i = 1; i <= 800000; i++) {
        num += i;
      }
    }

    public void job2() { // //得到开始的时间
      long start = System.currentTimeMillis();
      long num = 0;
      for (long i = 1; i <= 200000; i++) {
        num += i;
      } // 得的结束的时间
      long end = System.currentTimeMillis();
      System.out.println("AA 执行时间 " + (end - start));
    }
  }

  public class BB extends Template {
    @Override
    public void job() { // 这里也去,重写了 Template 的 job 方法
      long num = 0;
      for (long i = 1; i <= 80000; i++) {
        num *= i;
      }
    }
  }

  public class TestTemplate {
    public static void main(String[] args) {
      AA aa = new AA();
      aa.calculateTime(); // 这里还是需要有良好的 OOP 基础,对多态
      BB bb = new BB();
      bb.calculateTime();
    }
  }

相关文章

  • 7.设计模式

    一、单例模式单例模式就是确保某个类只有一个实例,并且该类只提供一个获取其对象实例的方式。分为饿汉式和懒汉式。 饿汉...

  • 7.设计模式(命令模式)

    1.命令模式最常见的应用场景:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什...

  • 交互设计精髓

    5.用户建模![Uploading chapter8原则和模式_067726.png . . .] 7.设计框架 ...

  • c#面向对象10--简单工厂设计模式

    23种设计模式 1.单例模式2.抽象工厂模式3.工厂方法模式4.建造者模式5.原型模式6.适配器模式7.装饰器模式...

  • JavaScript 设计模式(中)——7.组合模式

    7 组合模式 组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的; 7....

  • JS设计模式---7.桥接模式

    适用场合及栗子 事件监听器 假设有一个名为getBeerById的API函数。它根据一个标识符返回有关某种啤酒的信...

  • 【C++ 设计模式】7.桥接模式

    桥接模式:一种结构型设计模式 应用场景:一个对象由多部分属性组成,而对象与属性之间的关系,有些为has a,有些为...

  • 自己现在工作应该关注的点

    1.热修复 2.代码封装 3.高级UI 4.性能优化 5.设计模式 6.模块化 7.插件化

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 设计模式笔记汇总

    目录 设计原则 “依赖倒置”原则 未完待续... 设计模式 设计模式——策略模式 设计模式——装饰者模式 设计模式...

网友评论

      本文标题:7.设计模式

      本文链接:https://www.haomeiwen.com/subject/ewxdsrtx.html