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

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

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

所谓的类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得该对象实例的方法。如果我们要让类在虚拟机中只产生一个对象,我们首先必须将类得构造器的访问权限设置为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;
    }
}
相关推荐
彭于晏Yan6 分钟前
OkHttp 与 RestTemplate 技术选型对比
java·spring boot·后端·okhttp
金銀銅鐵16 分钟前
[Java] 如何理解 class 文件中字段的 descriptor?
java·后端
乐观的山里娃17 分钟前
【设计模式 12】原型:复制成功
设计模式
5008420 分钟前
Graph Engine 是什么,为什么需要它
java·人工智能·性能优化·ocr·wpf
未若君雅裁23 分钟前
服务雪崩、降级、熔断与服务保护
java·微服务
傻啦嘿哟40 分钟前
办公Agent与人工审核的“握手协议”:关键操作二次确认的设计模式
设计模式
就叫_这个吧41 分钟前
Java实现线程间的通讯--使用synchronized关键字和JUC方式实现
java·开发语言
学习中.........1 小时前
JVM 垃圾回收核心技术、演进全景与生产调优规范
java·jvm·测试工具
小小编程路1 小时前
C++类作用域
java·jvm·c++
小江的记录本1 小时前
【Java并发编程】锁机制:volatile:JMM内存模型、可见性/禁止指令重排、内存屏障、单例模式中的应用(附《思维导图》+《面试高频考点清单》)
java·后端·python·mysql·单例模式·面试·职场和发展