欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习23种JAVA设计模式

程序员文章站 2022-06-04 23:21:11
...

先简单记录三个工厂、三中单例整理

1、简单工厂没有抽象工厂类 一个工厂类 有一个抽象产品 多个产品实现类 可通过入参控制工厂返回的产品对象 缺点(扩展性差) 只能造一类产品

2、普通工厂有抽象工厂类 多个工厂类 有一个抽象产品 多个产品实现类 一个工厂实现类返回一个产品 缺点(扩展麻煩) 沒添加一个产品需要新添加一个工厂。。

3、抽象工厂有抽象工厂类 多个工厂类 有多个抽象产品 多个产品实现类 一个工厂实现类返回一类抽象产品

4、懒汉单例:
懒加载,静态实例先不初始化。双重检查锁(double check lock DCL)。用的时候在创建。

    private SingleBoy(){};
    private static  SingleBoy s = null;
    private static getInstance (){
    	if(s==null){
    		synchronized (s) {  
                if (s == null) {  
                    s= new SingleBoy();  
                }  
            }  
    	}
    	return s;
   } 			

创建对象的顺序:
1.在堆内存开辟内存空间。
2.在堆内存中实例化SingleTon里面的各个参数。
3.把变量指向堆内存空间。
JVM重排指令 DCL可能会出现问题,第一次创建对象的时候如果先执行了1、3没执行2,那么第二个线程進來发现 SingleBoy非空,就会返回一个半成品对象的地址。JDK1.6及以后,只要定义为private volatile SingleBoy就能解决DCL失效问题。针对DCL失效问题,A、B两个线程,A正在高速缓冲区创建SingleBoy,B先去主内存中看有没有SingleBoy,这时候A还没有返回SingleBoy给主内存,所以B认定SingleBoy没有创建,就会跑到同步块的代码前,在廁所外面排队。
https://blog.csdn.net/mnb65482/article/details/80458571

5、饿汉单例:
https://blog.csdn.net/nielinqi520/article/details/79132361
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。(小心反射)
加载类的时候直接创建 每次取不用重新new

        private SingleBoy(){};
        private static  SingleBoy s =  new SingleBoy();  
        private static getInstance (){
        	return s;
        } 

6、内部类单例

private SingleBoy(){}
private static class SingleBoyHandler {
    private static SingleBoy singleBoy= new Singleton();
}
public static Singleton getInstance(){
    return SingleBoyHandler.singleBoy;
}

第一次调用的时候才会加载静态内部类,既有饿汉的加载时创建特性,又有懒汉的用时才创建特性。

相关标签: 23种设计模式