Java 设计模式

1.单例设计模式

对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

1.1 饿汉式

  1. 构造器私有化 --> 防止直接new
  2. 类的内部创建对象
  3. 提供一个static的public方法 getInstance
java 复制代码
class GirlFriend {
    private String name;
    private static GirlFriend gf = new GirlFriend("小红红");

    private GirlFriend(String name) {
        System.out.println("構造器被調用.");
        this.name = name;
    }

    public static GirlFriend getInstance() {
        return gf;
    }

public class SingleTon01 {
    public static void main(String[] args) {

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

1.2 懒汉式

  1. 构造器私有化 --> 防止直接new
  2. 类的内部定义一个static对象
  3. 提供一个static的public方法 getInstance
  4. 只有当用户使用 getInstance 时,才返回对象, 再次调用时,会返回上次创建的对象
java 复制代码
class Cat {
    private String name;
    private static Cat cat ;       //默認是 null

    private Cat(String name) {
        System.out.println("構造器調用...");
        this.name = name;
    }

    public static Cat getInstance() {
        if(cat == null) {//如果還沒有創建 cat 對象
            cat = new Cat("小可愛");
        }
        return cat;
    }

public class SingleTon02 {
    public static void main(String[] args) {
       
        Cat instance = Cat.getInstance();
        System.out.println(instance);
        //再次調用 getInstance
        Cat instance2 = Cat.getInstance();
        System.out.println(instance2);
        System.out.println(instance == instance2);    //T
    }
}

饿汉式和懒汉式的区别:

  1. 创建对象的时机不同。饿汉式在类加载时就创建了对象实例,懒汉式在使用时才创建。
  2. 线程安全问题。饿汉式不存在线程安全问题,懒汉式存在线程安全问题。
  3. 浪费资源。饿汉式存在浪费资源的可能,如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费。懒汉式是使用才创建,就不存在这个问题。

2.模板设计模式

java 复制代码
// 抽象类-模板设计模式
abstract public class Template { 
    // 抽象方法
    public abstract void job();

    // 实现方法,调用 job 方法
    public void calculateTime() {
        long start = System.currentTimeMillis(); //得到开始的时间

        //动态绑定机制
        job(); 
        
        long end = System.currentTimeMillis();  //得的结束的时间
        System.out.println("任务执行时间 " + (end - start));
    }
}
java 复制代码
public class AA extends Template {
    //计算任务 1+....+ 800000
    //实现 Template 的抽象方法 job
    @Override
    public void job() { 
        long num = 0;
        for (long i = 1; i <= 800000; i++) {
            num += i;
        }
    }
}

public class BB extends Template{
    //这里也去,重写了 Template 的 job 方法
    public void 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();
    }
}
相关推荐
星竹晨L4 分钟前
C++继承机制:面向对象编程的基石
开发语言·c++
皮皮林55112 分钟前
5种接口频率监控方案实战对比,性能、成本、复杂度全解析!
java
似水流年 光阴已逝18 分钟前
从Jar包到K8s上线:全流程拆解+高可用实战
java·kubernetes·jar
G_dou_30 分钟前
Rust安装
开发语言·后端·rust
YA33336 分钟前
java设计模式八、组合模式
java·设计模式·组合模式
一枚码仔1 小时前
SpringBoot启动时执行自定义内容的5种方法
java·spring boot·后端
桦说编程1 小时前
如何在Java中实现支持随机访问的固定窗口队列
java·数据结构·后端
小白黑科技测评1 小时前
2025 年编程工具实测:零基础学习平台适配性全面解析!
java·开发语言·python
qwfys2001 小时前
实时Java规范(RTSJ):从理论到实践的实时系统编程范式
java·实时·java规范·rtsj
ejinxian1 小时前
Python 3.14 发布
java·开发语言·python