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

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

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

所谓的类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得该对象实例的方法。如果我们要让类在虚拟机中只产生一个对象,我们首先必须将类得构造器的访问权限设置为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;
    }
}
相关推荐
升鲜宝供应链及收银系统源代码服务1 分钟前
OMS 订单模块重构正式文档(一)---升鲜宝生鲜配送供应链管理系统
java·开发语言·重构·生鲜配送源代码·生鲜供应链源代码
Han.miracle5 分钟前
Redis 全套笔记:基础 API + 三大架构 + 缓存三大问题
java·windows·redis
zzb15808 分钟前
Fragment 生命周期深度图解:从 onAttach 到 onDetach 完整流程(面试必备)
android·java·面试·安卓
银色火焰战车28 分钟前
浅析golang中的垃圾回收机制(GC)
java·jvm·golang
zhangjw3429 分钟前
第4篇:Java数组与字符串:从基础用法到面试高频考点
java·java基础知识
Kel34 分钟前
LangChain.js 架构设计深度剖析
人工智能·设计模式·架构
俺爱吃萝卜37 分钟前
Spring Boot 3 + JDK 17:新一代微服务架构最佳实践
java·spring boot·架构
曹牧42 分钟前
Spring :component-scan
java·后端·spring
下地种菜小叶1 小时前
定时任务系统怎么设计?一次讲清任务注册、分布式调度、幂等执行与失败补偿
java·开发语言·数据库·oracle·rabbitmq
做个文艺程序员1 小时前
Spring Boot 项目集成 OpenClAW【OpenClAW + Spring Boot 系列 第1篇】
java·人工智能·spring boot·开源