Java面向对象重温【单例设计模式】

单例设计模式

概念

设计模式:软件前辈们在做项目的过程中,对于某类问题,发明了一些最为有效的解决方式。

Java语言中,总共有23种设计模式

从今天开始:会陆陆续续介绍:单例,工厂,模板,策略等待

单例设计模式:设计一个类,要保证该类有且只能创建一个对象的代码书写方式经验的总结

单例模式的作用和意义:能避免重复创建;应用于避免存在多个实例引起程序逻辑错误的场合;较节约内存,因为它限制了实例的个数,有利于java垃圾回收


两种模式

饿汉式:

  • 准备一个私有的静态属性,属性类型即为本类类型(且要进行实例化)
  • 准备一个私有的无参数的构造函数
  • 对外暴露一个获取本类实例的静态方法

需求:

使用单例设计模式,设计一个美国总统类。


/**
 * 美国总统单例类
 */
public class AmericaPresident {
    //饿汉式:
    //1.准备一个私有的静态属性,属性类型即为本类类型(且要进行实例化)
    private static AmericaPresident instance = new AmericaPresident();

    //2.准备一个私有的无参数的构造函数
    private AmericaPresident(){//一定要是私有的,否则,在该类外部,可以构建任意多个对象
        super();
    }

    //3.对外暴露一个获取本类实例的静态方法
    public static AmericaPresident getInstance(){//必须将该类升级为静态方法,保证可以绕过实例,通过类名直接调用该方法
        return instance;
    }
}


/**
 * 单例测试类
 */
public class TestPresident {
    public static void main(String[] args) {
        //需求:
        //构建多个实例,比对各个实例的地址,看是否指向堆中的同一个对象
        //AmericaPresident aoBaMa = new AmericaPresident();
        //这里会提示报错,因为我们在单例类中设置了私有的构造方法,所以不能直接构建,那么要我想构建要怎么构建呢?

        AmericaPresident aoBaMa = AmericaPresident.getInstance();
        AmericaPresident aoBaMa2 = AmericaPresident.getInstance();
        System.out.println("是同一个实例否?"+(aoBaMa == aoBaMa2));
        System.out.println("是同一个实例否?"+(aoBaMa.equals(aoBaMa2)));

    }
}

懒汉式

  • 准备一个私有的静态属性,属性类型即为本类类型
  • 准备一个私有的无参数的构造函数
  • 对外暴露一个获取本类实例的静态方法
    • 先判断属性是否为null,若为null,那么就new;否则直接返回即可

需求:

使用单例设计模式,设计一个Emporor(皇帝类)。

/**
 * 皇帝单例类
 */
public class Emporor {
//      懒汉式:
//      1.准备一个私有的静态属性,属性类型即为本类类型
    private static Emporor emporor;
//      2.准备一个私有的无参数的构造函数
    private Emporor(){
        super();
    }
//      3.对外暴露一个获取本类实例的静态方法
//          先判断属性是否为null,若为null,那么就new;否则直接返回即可
    public static Emporor getInstance(){
        if (emporor == null){
            emporor = new Emporor();
        }
        return emporor;
    }
}
/**
 * 皇帝类测试类
 */
public class TestEmporor {
    public static void main(String[] args) {
        Emporor emporor1 = Emporor.getInstance();
        Emporor emporor2 = Emporor.getInstance();

        System.out.println("是否是同一个皇帝呢?"+(emporor1==emporor2));
        //如果两个引用类型通过==来比较,
        // 比较的是两个实例在堆内存中的首地址值是否相同
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值