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

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

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

所谓的类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得该对象实例的方法。如果我们要让类在虚拟机中只产生一个对象,我们首先必须将类得构造器的访问权限设置为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;
    }
}
相关推荐
名字不好奇2 小时前
C++虚函数表失效???
java·开发语言·c++
u0104058362 小时前
Java中的服务监控:Prometheus与Grafana的集成
java·grafana·prometheus
行稳方能走远2 小时前
Android java 学习笔记2
android·java
yaoxin5211232 小时前
286. Java Stream API - 使用Stream.iterate(...)创建流
java·开发语言
qq_12498707532 小时前
基于springboot的鸣珮乐器销售网站的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·spring·毕业设计·计算机毕业设计
海南java第二人2 小时前
SpringBoot核心注解@SpringBootApplication深度解析:启动类的秘密
java·spring boot·后端
win x2 小时前
Redis集群
java·数据库·redis
r_oo_ki_e_2 小时前
java23--异常
java·开发语言
qq_12498707532 小时前
基于Spring Boot的“味蕾探索”线上零食购物平台的设计与实现(源码+论文+部署+安装)
java·前端·数据库·spring boot·后端·小程序