zoukankan      html  css  js  c++  java
  • 设计模式之一 单例模式

    单例模式的定义:

    确保某一个类只有一个实例,而且自行实例化像整个系统提供这个实例。

    单例模式通用类如下:

    image

    通用代码如下:

    public class Singleon {
        
        //定义静态singleon
        private final static Singleon  singleon = new Singleon();
        
        /**
        * <p>Title: </p> 
        * <p>Description: 不许外部调用构造函数</p>
         */
        private Singleon() {
            
        }
        
        // 取得实例对象
        public static Singleon getSingleon(){
            return singleon;
        }
        
        //其他方法,尽量使static
        public static void  doSomething(){
            
        }
    
    }

    单例模式优点:
    1.内存中只有一个实例,减少内存开支。
    2.避免对资源的多重占用,例如一个文件的书写动作
    3.单例模式可以在系统设置全局的访问点,优化和共享资源访问。

    单列模式使用的场景:
    1. 要求生成唯一序列号的环境;
    2. 在整个项目中需要一个共享访问点或共享数据。
    3. 创建一个对象需要消耗的资源过多,如果要访问IO和数据库等资源;
    4. 需要定义大量静态常量和静态方法(如工具类)的环境,可以采用单例模式

    单例模式的注意事项

    1.线程不安全

    public class Singleon {
        
        //定义静态singleon
        private  static Singleon  singleon = null;
        
        /**
        * <p>Title: </p> 
        * <p>Description: 不许外部调用构造函数</p>
         */
        private Singleon() {
            
        }
        
        // 取得实例对象
        public static Singleon getSingleon(){
            
            if(singleon==null){
                singleon = new Singleon();
            }
            
            return singleon;
        }
        
        //其他方法,尽量使static
        public static void  doSomething(){
            
        }
    
    }

    2.线程安全

    public class Singleon {
        
        //定义静态singleon
        private  static Singleon  singleon = null;
        
        /**
        * <p>Title: </p> 
        * <p>Description: 不许外部调用构造函数</p>
         */
        private Singleon() {
            
        }
        
        // 取得实例对象
        public static  synchronized  Singleon getSingleon(){
            
            if(singleon==null){
                singleon = new Singleon();
            }
            
            return singleon;
        }
        
        //其他方法,尽量使static
        public static void  doSomething(){
            
        }
    
    }

    单例模式的扩展

    public class SingleonEx {
        //实例的数量
        private static final  int MAXNUM = 3;
        
        // 装载 SingleonEx
        private static ArrayList<SingleonEx>  singleonLIst = new ArrayList<SingleonEx>();
        
        //
        private static ArrayList<String>    nameList = new ArrayList<String>();
        
        //
        private  static int  iCount= 0;
        
        
        //初始化.....
        static{
            for(int i=0;i<MAXNUM; i++){
                singleonLIst.add(new SingleonEx("单例扩展:" + i ));
            }
        }
        
        /**
         * 
        * <p>Title: </p> 
        * <p>Description: 无参构造</p>
         */
        private SingleonEx() {
            
        }
        
        /**
         * 
        * <p>Title: </p> 
        * <p>Description: 有参构造</p> 
        * @param name
         */
        private SingleonEx(String name){
            nameList.add(name);        
        }
        
        /**
         * 
        * @Title: getInstance 
        * @Description: 获取实例对象
        * @param @return    设定文件 
        * @return SingleonEx    返回类型 
        * @throws
         */
        public static SingleonEx getInstance() {
            //随机数....
            Random rnd = new Random();
            //随机产生一个
            iCount=rnd.nextInt(MAXNUM);
            //
            return singleonLIst.get(iCount);
            
        }
        
        /**
         * 
        * @Title: say 
        * @Description: 测试使用打印点东西...
        * @param     设定文件 
        * @return void    返回类型 
        * @throws
         */
         public static  void say() {
             
              System.out.println(nameList.get(iCount));
         }
         
         /**
          * 
         * @Title: main 
         * @Description: 入口测试用
         * @param @param args    设定文件 
         * @return void    返回类型 
         * @throws
          */
         public static void  main(String[] args){
             //定义测试5个
             int   iTest = 5;
             for(int i=0;i< iTest; i++){
                 SingleonEx  sEx = SingleonEx.getInstance();
                 sEx.say();
             }
             
         }
    
    }
  • 相关阅读:
    Appium
    iOS 定位方式 iOSNsPredicateString 详解
    Appium 遇到 Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65 的解决方法
    自动化工具 appium 在真机上测试的配置 (使用个人 Apple ID)
    查看iOS App的bundleId
    阿里巴巴热招求推荐求转发
    一文读懂网络协议
    Idea生成Javadoc
    系统监控
    Hystrix使用详解
  • 原文地址:https://www.cnblogs.com/tjxwg/p/4049920.html
Copyright © 2011-2022 走看看