zoukankan      html  css  js  c++  java
  • 单例设计模式(附AS3)

    单态定义:
    Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

    在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。

    还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。

    另外方面,Singleton也能够被无状态化。提供工具性质的功能,
    Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
    我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。

    如何使用?
    一般Singleton模式通常有几种形式:

    public class Singleton {

    private Singleton(){}

    //在自己内部定义自己一个实例,是不是很奇怪?
    //注意这是private 只供内部调用

    private static Singleton instance = new Singleton();

    //这里提供了一个供外部访问本class的静态方法,可以直接访问
    public static Singleton getInstance() {
    return instance;
    }
    }

    第二种形式:

    public class Singleton {

    private static Singleton instance = null;
    public static synchronized Singleton getInstance() {
    if (instance==null)
    instance=new Singleton();
    return instance; }

    }

    使用Singleton.getInstance()可以访问单态类。

    上面第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。

    注意到lazy initialization形式中的synchronized,这个synchronized很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。

    AS3的单例模式:

    方法一:程序一开始就创建

    package {  
        public class Singleton {  
            private static  var _instance:Singleton = new Singleton();  
            public function Singleton() {  
                if (_instance) {  
                    throw new Error("只能用getInstance()来获取实例");  
                }  
            }  
            public static function getInstance():Singleton {  
                return _instance;  
            }  
        }  

    方法2:解决1的问题了

    package {  
        public class Singleton {  
            private static  var _singleton:Boolean=true;  
            private static  var _instance:Singleton;  
            public function Singleton() {  
                if (_singleton) {  
                    throw new Error("只能用getInstance()来获取实例");  
                }  
            }  
            public static function getInstance() {  
                if (!_instance) {  
                    _singleton=false;  
                    _instance=new Singleton();  
                    _singleton=true;  
                }  
                return _instance;  
            }  
        }  

  • 相关阅读:
    android绘画折线图二
    android绘画折线图一
    jQuery Select操作大集合
    jquery事件切换hover/toggle
    jquery $(document).ready() 与window.onload的区别
    canny边缘检测 C++手动实现
    高斯核原理和C++实现
    darknet-yolov3 burn_in learning_rate policy
    UserWarning: indexing with dtype torch.uint8 is now deprecated, please use a dtype torch.bool instead
    BatchNormaliation
  • 原文地址:https://www.cnblogs.com/happysky97/p/1893746.html
Copyright © 2011-2022 走看看