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();
    }
}
相关推荐
岭南灯火2 分钟前
前端通用交互式几何编辑器的设计法则 4 - 绘制、悬停与编辑
前端·设计模式·架构
码农颜14 分钟前
5.4.1 锁分类
java·数据库·mysql
岭南灯火16 分钟前
前端通用交互式几何编辑器的设计法则 6 - 配套设施与工程化
前端·设计模式·架构
岭南灯火17 分钟前
前端通用交互式几何编辑器的设计法则 5 - 辅助元素的设计
前端·设计模式·架构
牛艺翔1 小时前
C++基础
开发语言·c++
键盘会跳舞1 小时前
C++ :容器适配器stack源码级拆解
开发语言·c++··stack·先进后出
linux-hzh1 小时前
百日算法修炼 · Day 03
java·算法
美味蛋炒饭.2 小时前
Git 版本控制(下)
开发语言·git·学习·总结·后端开发
我星期八休息2 小时前
网络编程—网络层
开发语言·前端·网络·人工智能·智能路由器
不负岁月无痕2 小时前
简单理解操作系统结构
java·linux·c语言·开发语言·c++·面试