单例模式

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;
    }
}
枚举

相关文章: