面向对象(下)-设计模式与单例设计模式

面向对象(下)-设计模式与单例设计模式

设计模式是在大量的实践中总结和理论化之后优先的代码结构、编码风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和探索。总结就是"套路"。

所谓的类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得该对象实例的方法。如果我们要让类在虚拟机中只产生一个对象,我们首先必须将类得构造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,只能调用改类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该对象的变量也必须定义成静态的。

面向对象(下)单例的饿汉式实现

java 复制代码
public class SingletonTest {
    public static void main(String[] args) {
        // Bank bank = new Bank();  // 编译报错  'Bank()' has private access in '.Bank'
        Bank bank1 = Bank.getInstance();  // 饿汉式单例!
        Bank bank2 = Bank.getInstance();  // 饿汉式单例!
        System.out.println(bank2 == bank1);  // true
    }
}

class Bank{
    // 1. 私有化类的构造器
    private Bank() {
        System.out.println("饿汉式单例!");
    }
    // 2. 内部创建类的对象(需要是static)
    private static Bank instance = new Bank();
    // 3. 提供公共的静态的方法,返回类的对象
    public static Bank getInstance() {
        return instance;
    }
}

注意以下方式造对象,不属于单例,不能为了省事将new Bank()直接返回,如果这么做,每次getInstance都会创建一个对象:

java 复制代码
public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1 = Bank.getInstance();  
        Bank bank2 = Bank.getInstance();  
        System.out.println(bank2 == bank1);  // false,两次对象不一样,不是单例
    }
}
class Bank{
    // 1. 私有化类的构造器
    private Bank() {
        System.out.println("不是单例模式!");
    }
    // 2. 提供公共的静态的方法,返回类的对象
    public static Bank getInstance() {
        return new Bank();  // 每次都会造对象
    }
}

面向对象(下)单例的懒汉式

java 复制代码
public class SingletonTest {
    public static void main(String[] args) {
        Order order1 = Order.getInstance();  // 懒汉式单例!
        Order order2 = Order.getInstance();  // 不打印
        System.out.println(order2 == order1);  // true
    }
}

class Order{
    // 1. 私有化类的构造器
    private Order() {
        System.out.println("懒汉式单例!");
    }
    // 2. 声明当前类的对象,没有初始化
    private static Order instance = null;
    // 3. 提供公共的静态的方法,返回类的对象
    public static Order getInstance() {
        if (instance == null) {
            instance = new Order();
        }
        return instance;
    }
}
相关推荐
guestsun2 小时前
SpringBoot七大事务失效场景分析
java·spring boot·mybatis
毕设源码-邱学长7 小时前
【开题答辩全过程】以 基于Java的学校住宿管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
兑生9 小时前
【灵神题单·贪心】1481. 不同整数的最少数目 | 频率排序贪心 | Java
java·开发语言
daidaidaiyu9 小时前
一文学习 Spring 声明式事务源码全流程总结
java·spring
零雲10 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别
java·开发语言·面试
左左右右左右摇晃13 小时前
Java并发——synchronized锁
java·开发语言
sxlishaobin14 小时前
Java I/O 模型详解:BIO、NIO、AIO
java·开发语言·nio
彭于晏Yan14 小时前
Spring AI(二):入门使用
java·spring boot·spring·ai
有一个好名字14 小时前
vibe codeing 开发流程
java
兑生14 小时前
【灵神题单·贪心】3745. 三元素表达式的最大值 | 排序贪心 | Java
java·开发语言