加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

Java设计模式概括—— 单例模式

发布时间:2021-11-15 14:39:56 所属栏目:教程 来源:互联网
导读:1. 意图 为了确保一个类有且仅有一个实例,并为它提供一个全局访问点。 2. 机制 创建一个独一无二觉得的对象,有多种方式。但是不管你如何创建一个单例对象,都必须要确保其他开发人员不能创建该单例对象的新的实例。 那么如何做到这一点呢? 答:为了避免其
1. 意图
为了确保一个类有且仅有一个实例,并为它提供一个全局访问点。
 
2. 机制
创建一个独一无二觉得的对象,有多种方式。但是不管你如何创建一个单例对象,都必须要确保其他开发人员不能创建该单例对象的新的实例。
 
那么如何做到这一点呢?  答:为了避免其他开发人员实例化你定义的类,可以创建唯一一个构造函数,并将其设置为私有的访问权限。注意,如果创建了其他非私有的构造函数,或者没有创建任何构造函数,其他对象都能够实例化改类。
 
设计一个单例类的时候,需要确定何时实例化该类的单例对象。一种做法是创建这个类的实例,并将它作为该类的静态成员变量。例如:
 
private static Factory factory = new Factory();
然后通过一个公共的getFactory()静态方法获得该类的唯一实例。实例代码:
 
public class Factory{
    private static Factory factory = new Factory ();
    public static Factory getFactory() {
        return factory;
    }
    private Factory() {}
}  
如果不希望提前创建单例实例,还可以在第一次需要的时候,延迟初始化它。
 
if (factory == null)
    factory = new Factory();
延迟不延迟有哪些方面的区别呢? 为什么实例化还有延迟和非延迟?   一般延迟实例化对象有两个原因: 1. 在静态初始化的时候,没有足够的信息对单例对象进行初始化。  2. 选择延迟初始化单例对象与获取资源有关,如数据库连接,没有使用的需求,就没有必要实例化该单例对象。
 
3. 单例与线程
如果想在多线程环境下延迟初始化一个单例模型,必须避免多个线程同时初始化该单例对象。在多线程环境下,无法保证在其他线程开始执行该方法时,当前线程已经完整的执行完该方法。这可能出现两个线程同时初始化一个单例对象的情况。为了避免这种情况,需要使用锁机制去协调不同线程对同一方法的执行。
 
public class SingletonClass {
    private static SingletonClass instance = null;
    public static SingletonClass getInstance() {
        if(instance==null) {
            synchronized(SingletonClass.class) {
                if(instance==null) {
                    instance=new SingletonClass();
                }
            }
        }
        return instance;
    }
    private SingletonClass() {}
}
单例模式或许是最负盛名的一个设计模式,但是很容易被误用,不要让单例作为创建全局变量的一种花哨方法。因为单例会引入耦合,应减少使用单例模式的类的数量。最好的方式是:类只知道与它协作的对象,不必了解它所需要的限制。 需要注意的是:对象具有唯一性,不代表使用了单例模式。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读