单例模式
什么是设计模式?
- 对静态属性和方法的经典使用
- 在大量实践中总结的优质代码结构和风格,以及问题的思考方式
什么是单例模式?
采取方法保证在整个软件系统中,某一个类只能有一个实例对象,并且该类只提供一个取得对象实例的方法
单例模式的两种方式:
实现步骤:
- 构造器私有化
- 类内部创建对象
- 向外暴露一个静态的公共方法(getInstance)
【单例模式-饿汉式】
无论是否使用对象,都会创建;不使用对象时可能造成资源浪费。
package com.java_learn.oop_advanced.singular_;
public class HungryMan {
public static void main(String[] args) {
/**
* 单例设计模式-饿汉式
*/
Girlfriend g1 = Girlfriend.getInstance();
Girlfriend g2 = Girlfriend.getInstance()
System.out.println(g1==g2);//T
}
}
class Girlfriend{
/**
* 1.私有化构造器
* 2.在类内部创建对象
* 3。暴露一个静态的公共方法
*/
private String name;
private Girlfriend(String name) {
this.name = name;
}
private static Girlfriend gf=new Girlfriend("OG");
public static Girlfriend getInstance(){
return gf;
}
@Override
public String toString() {
return "Girlfriend{" +
"name='" + name + '\'' +
'}';
}
}
【单例模式-懒汉式】
类加载时并不会创建对象,使用时才创建
package com.java_learn.oop_advanced.singular_;
public class LazyMan {
public static void main(String[] args) {
Pig p1=Pig.getInstance();
Pig p2=Pig.getInstance();
System.out.println(p1==p2);
}
}
class Pig{
private String name;
private Pig(String name) {
this.name = name;
}
private static Pig peiqi;
public static Pig getInstance(){//🚩主要区别
if(peiqi == null){
peiqi=new Pig("佩奇");
}
return peiqi;
}
@Override
public String toString() {
return "Pig{" +
"name='" + name + '\'' +
'}';
}
}
饿汉式 VS 懒汉式
-
最主要区别:饿汉式类加载时创建对象,懒汉式使用时才创建对象
-
饿汉式不存在线程安全,懒汉式存在线程安全
-
饿汉式当没有使用对象时会产生资源浪费
final关键字
基本介绍
- 可以修饰类、属性、方法、局部变量
- 不希望类被继承时,可以使用final修饰该类;
final class S{}
- 不希望父类某个方法被重写时,用final修饰该方法;
public final int gets(){}
- 不希望属性被修改;
public final String name
- 不希望局部变量被修改
细节与注意
- final修饰的属性又叫常量;用形式为:XX_XX_XX命名
- final修饰的属性定义时,必须赋值;且以后不可修改,有如下位置可赋值:
- 定义时
- 构造器
- 代码块
- 若final修饰的属性时静态的(
public static final int TAX_RADE
),位置只能是:
- 定义时
- 静态代码块,🚩不能在构造器中
- 被final修饰的类不能被继承,但是可以实例化
- 若类中有方法被final修饰,方法不可重写,但是类可继承
- 若类被final修饰,其方法不必使用final
- final不允许修饰构造器
- final和static搭配使用效率高;不会导致类加载
- 包装类(String,Boolean,Integer,Double)都是final修饰