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();
    }
}
相关推荐
顾漂亮21 分钟前
Token快过期的三种续期方案
java·spring·状态模式
徐同保1 小时前
tailwindcss暗色主题切换
开发语言·前端·javascript
蓝纹绿茶1 小时前
bash:**:pip:***python: 错误的解释器: 没有那个文件或目录
开发语言·python·pip
云知谷1 小时前
【经典书籍】C++ Primer 第15章类虚函数与多态 “友元、异常和其他高级特性” 精华讲解
c语言·开发语言·c++·软件工程·团队开发
START_GAME2 小时前
深度学习Diffusers:用 DiffusionPipeline 实现图像生成
开发语言·python·深度学习
牢七2 小时前
mwf攻防。
java
不爱编程的小九九2 小时前
小九源码-springboot088-宾馆客房管理系统
java·开发语言·spring boot
Evand J3 小时前
【MATLAB例程】到达角度定位(AOA),平面环境多锚点定位(自适应基站数量),动态轨迹使用EKF滤波优化。附代码下载链接
开发语言·matlab·平面·滤波·aoa·到达角度
细节控菜鸡3 小时前
【2025最新】ArcGIS for JS 实现随着时间变化而变化的热力图
开发语言·javascript·arcgis
Pluto_CSND4 小时前
Java实现gRPC双向流通信
java·开发语言·单元测试