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

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

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

所谓的类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得该对象实例的方法。如果我们要让类在虚拟机中只产生一个对象,我们首先必须将类得构造器的访问权限设置为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;
    }
}
相关推荐
guslegend34 分钟前
Tomact高级使用及原理剖析
java
Code blocks35 分钟前
SpringBoot从0-1集成Minio对象存储
java·spring boot·后端
故渊ZY40 分钟前
MyBatis事务原理与实战指南
java·mybatis
HTouying1 小时前
线程池【工具类】
java
深盾科技1 小时前
融合C++与Python:兼顾开发效率与运行性能
java·c++·python
我待_JAVA_如初恋1 小时前
idea创建MavenJavaWeb项目以后,包结构缺java
java·ide·intellij-idea
来深圳1 小时前
leetcode 739. 每日温度
java·算法·leetcode
CC大煊1 小时前
【java】Druid数据库连接池完整配置指南:从入门到生产环境优化
java·数据库·springboot
JIngJaneIL2 小时前
基于java+ vue交友系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·交友
苹果酱05672 小时前
解决linux mysql命令 bash: mysql: command not found 的方法
java·vue.js·spring boot·mysql·课程设计