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();
}
}