java设计模式之单例模式

来源:互联网 发布:淘宝男装店铺 编辑:程序博客网 时间:2024/05/21 08:03
java设计模式有23种模式之多,今天自己接触到单例模式,在此做个总结,如有理解不当之处,还请各位读者指出。首先单例模式有三种方式:    1.饿汉式    2.懒汉式    3.双重校验式(双重校验式是基懒汉式在多线程中的安全隐患及解决方案,优化策略)单例模式的设计步骤:    1.私有化该类的构造函数    2.通过new在本类中创建一个本类对象    3.定义一个共有的方法将创建的对象返回接下来用代码来分别来分析三种方式的利弊:
第一:饿汉式:(举例)        测试类:        package com.trkj.demo;        public class Test {        public static void main(String[] args) {                Single s=Single.getInstance();                s.setName("张三");                System.out.println(s.getName());            }        }        package com.trkj.demo;        public class Single {        private String name;        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        private static final Single s=new Single();        private Single(){};        public static Single getInstance(){            return s;        }    }
注意:为什么方法是静态的:不能new对象却想调用类中方法,方法必然是静态的,静态方法只能调用静态成员,所以对象也是静态的;为什么对象的访问修饰符是private,不能是public?不能,如果访问修饰符是public,则Single.s也可以得到该类对象,这样就造成了不可控。
第二:懒汉式(举例)        public class{            private static Single s=null;            private Single(){};            public static Single getInstance(){                if(s==null){                    s=new Single();                }                return s;            }        }
懒汉式的好处是它尽最大可能的节省了内在空间;弊端:在多线程编程中,使用懒汉式可能会造成类的对象在内存中不中唯一,虽然通过修改代码可以改正这些问题,但是效率又降低了,所以在实际开发中使用的并不多。
双重校验式(基于懒汉式在多线程中的安全隐患及解决方案,优化策略)        举例:        class Single{            private static Single s=null;            private Single(){};            public static Single getInstance(){                if(s==null){   //1                    synchronized(Single.class){  //2                        if(s=null){//3                            s=new Single();                        }                    }                }                return s;            }        }
总结:在代码中,在注释为1的地方是进行第一次判空操作,目的是提高效率,在注释为2的地方是同步代码块的入口,目的是保证线程安全;在注释为3的地方 进行第二次判空操作是为了保证单例对象的唯一性。
原创粉丝点击