单例模式
1、在当前系统中,某个类型的对象,最多只能有一个,就需要使用单例设计模式
2、几种格式
//老汉式 class WeekDay1{ //1.构造方法私有化 private WeekDay1() {} //2.创建静态常量对象 public static final WeekDay1 MON = new WeekDay1(); } //饿汉式 class WeekDay2{ //1.构造方法私有化 private WeekDay2() {} //2.创建本类静态私有对象 private static WeekDay2 Mon = new WeekDay2(); //3.对外提供私有对象的访问 public static WeekDay2 getInstance() { return Mon; } } //懒汉式 class WeekDay3 { //1.构造方法私有化 private WeekDay3(){} //2.声明本类私有对象 private static WeekDay3 Mon; //3.判断并创建对象 public static WeekDay3 getInstance(){ if(Mon==null){ Mon = new WeekDay3(); } return Mon; } }
3、问题:单例模式会不会产生线程安全问题?如何解决?会不会影响效率?如何提升效率?
单例模式的懒汉式会产生线程安全问题,可以使用同步代码块解决,效率问题看下面代码
class WeekDay3 { //1.构造方法私有化 private WeekDay3(){} //2.声明本类私有对象 private static WeekDay3 Mon; //3.判断并创建对象 public static WeekDay3 getInstance(){ //因为只有第一次才会判断,所以再判断一次可以提高效率 if(Mon==null) { //加同步代码块可以解决线程不安全的问题,但效率会变低 synchronized (WeekDay3.class) { if(Mon==null){ Mon = new WeekDay3(); } } } return Mon; } }
枚举
1、什么是枚举?
描述对象个数有限的类
2、本质上是有多个对象的单例设计模式
3、关键字enum,声明出来也是一个类,编译也是.class文件
abstract class WeekDay1{//WeekDay2的对比类 String name; private WeekDay1() {} public abstract void run(); private WeekDay1(String name) {this.name=name;} public static final WeekDay1 MON = new WeekDay1("1") { @Override public void run() { // TODO Auto-generated method stub } }; public static final WeekDay1 TUE = new WeekDay1("2") { @Override public void run() { // TODO Auto-generated method stub } }; public static final WeekDay1 WEN = new WeekDay1("3") { @Override public void run() { // TODO Auto-generated method stub } }; } enum WeekDay2{//可以实现抽象方法,直接写在对象后的大括号内 MON("1"){ @Override public void run() { } },TUE("2"){ @Override public void run() { } },WEN("3"){ @Override public void run() { } }; String name; public void setName(String name) {this.name=name;} public String getName() {return name;} private WeekDay2(String name) {this.name = name;} public abstract void run(); } enum WeekDay3{ MON,TUE,WEN;//相当于普通类中public static final WeekDay3 MON=new WeekDay3();.. } enum WeekDay4{//可以定义属性,直接写在对象名后的()内 MON("1"),TUE("2"),WEN("3"); private String name; private WeekDay4(String name) { this.name = name; } }