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();
    }
}
相关推荐
superkcl20222 小时前
【JAVA】【Stream流】
java·windows·python
mldong2 小时前
mldong 快速开发框架登录模块设计与实现
java·后端·架构
三体世界3 小时前
HTTPS加密原理
linux·开发语言·网络·c++·网络协议·http·https
bulucc3 小时前
Maven 或 Gradle 下载和添加 jar 文件的步骤
java·maven·jar
我爱Jack3 小时前
@annotation:Spring AOP 的“精准定位器“
java·后端·spring
明月与玄武3 小时前
Python爬虫工作基本流程及urllib模块详解
开发语言·爬虫·python
云空3 小时前
《NuGet:.NET开发的魔法包管理器》
开发语言·.net
一ge科研小菜鸡3 小时前
编程语言的演化与选择:技术浪潮中的理性决策
java·c语言·python
我崽不熬夜3 小时前
为什么你该立即学习 Java 的 Lambda 表达式?
java·后端·java ee
wsdchong之小马过河3 小时前
2025虚幻引擎文件与文件夹命名规律
java·数据库·虚幻