Java常见的4种设计模式——单例模式

java的四种设计模式:
一.单例模式
(一)饿汉模式
(二)懒汉模式
1.非线程安全
2.线程安全
(1)普通锁模式
(2)双重锁模式(既安全,又能提高效率)
二.模版模式
三.装饰模式
四.工厂模式

这四种模式是个人理解,如有不对之处,大家可以指出。
一.单例模式(一次只能创建一个对象)
(一)饿汉模式
步骤:
1.初始化一个私有的对象。
2.建立私有化构造方法,不让外部直接创建对象。
3.建立一个公有方法,暴露给外部调用。该公有方法直接返回私有的对象。
4.通过类名直接调用该公有方法。

/**
 * 单例设计模式:
 *      饿汉设计模式
 */
public class singleInstance {
    private static singleInstance instance = new singleInstance();
    private singleInstance(){};
    //该方法用于暴露给外部调用
    public static singleInstance getInstance(){
        return instance;
    }
}
public class singleInstanceDemo {
    public static void main(String[] args) {
        singleInstance instance = singleInstance.getInstance();
    }
}

(二)懒汉模式
步骤:
1.创建私有对象,但不初始化,什么时候用,什么时候再初始化,太懒了,但能节省内存,提高效率。
2.建立私有化构造方法,不让外部直接创建对象。
3.建立一个公有方法,暴露给外部调用。该公有方法直接返回私有的对象。
4.通过类名直接调用该公有方法
种类:
1.非线程安全

/**
 * 单例设计模式:
 *      懒汉设计模式(非线程安全)
 */
public class singleInstance {
    //这里不初始化
    private static singleInstance instance;
    private singleInstance(){};
    //该方法用于暴露给外部调用
    public static singleInstance getInstance(){
        if(instance == null){
            singleInstance instance = new singleInstance();
        }
        return instance;
    }
}
public class singleInstanceDemo {
    public static void main(String[] args) {
        singleInstance instance = singleInstance.getInstance();
    }
}

2.线程安全
(1)普通锁模式

/**
 * 单例设计模式:
 *      懒汉设计模式(线程安全 普通锁模式)
 */
public class singleInstance {
    //这里不初始化
    private static singleInstance instance;
    private singleInstance(){};
    //该方法用于暴露给外部调用
    public static synchronized singleInstance getInstance(){
        if(instance == null){
            singleInstance instance = new singleInstance();
        }
        return instance;
    }
}
public class singleInstanceDemo {
    public static void main(String[] args) {
        singleInstance instance = singleInstance.getInstance();
    }
}

(2)双重锁模式(既安全,又能提高效率)

/**
 * 单例设计模式:
 *      懒汉设计模式(线程安全 双锁模式)
 */
/**
 * 单例设计模式:
 *      懒汉设计模式(线程安全 双锁模式)
 */
public class singleInstance {
    //这里不初始化
    private static singleInstance instance;
    private singleInstance(){};
    //该方法用于暴露给外部调用
    public static singleInstance getInstance(){
        if(instance == null){//这个if语句看似多余,其实是为了提高效率,提早阻隔不满足条件的进程进入。
            synchronized (singleInstance.class){
                if(instance == null){//这个if语句的作用是保证单例。如果没有该句,那么Thread1和Thread2都可能进来,创建多个对象。
                    singleInstance instance = new singleInstance();
                }
            }
        }
        return instance;
    }
}

public class singleInstanceDemo {
    public static void main(String[] args) {
        singleInstance instance = singleInstance.getInstance();
    }
}

你可能感兴趣的:(Java)