`
Ivan_Pig
  • 浏览: 387138 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

DesignPattern学习-----Singleton

阅读更多

   学习了Java两个月。。之后两个月学习jsp,servlet,sql,html一堆杂七杂八的东西。又花一个多月复习了一下。。。
    之后一个偶然的机会,跑J道里逛了逛。。banq老大强调oo思想,设计模式。。于是开始学习设计模式 :D
    刚开始学。。好多东西都不是那么明白。。。有理解错误的地方还请多多指教。。。

    我从Singleton开始学。。我是这么理解的。。

    Singleton顾名思义就是只能创建一个实例对象。。所以不能拥有public的构造方法。。

java 代码

  1. public class Singleton{   
  2.        private Singleton(){}   
  3. }  

既然构造方法是私有的,那么从外面不可能创建Singleton实例了。。只能从内部创建。。所以需要一个方法来创建此实例。。此方法肯定必须是static的。。

 

java 代码
  1. public class Singleton{      
  2.        private Singleton(){}      
  3.        
  4.        public static Singleton getInstance(){   
  5.             return [Singleton Instance];   
  6.       }   
  7. }   

getInstance方法要返回一个Singleton实例。。就要一个Singleton类型的变量来存储。。声明一个Singleton类型的属性。。同样需要是static 的。。静态方法只能访问静态属性。。。

java 代码
  1. public class Singleton{      
  2.        private Singleton(){}      
  3.        
  4.        public static Singleton getInstance(){   
  5.             single=new Singleton();   
  6.             return single;   
  7.       }   
  8.       private static Singleton single;   
  9. }   

如此就能获得Singleton的实例了。。但是并不能确保只生成一个实例。。。需做判断。。。

java 代码
  1. public class Singleton{      
  2.        private Singleton(){}      
  3.        
  4.        public static Singleton getInstance(){   
  5.            if(single==null){   
  6.                 single=new Singleton();   
  7.            }   
  8.            return single;   
  9.        }   
  10.       private static Singleton single;   
  11. }   

这样就可以了。。。

接着就牵扯到了线程问题。。。假设有两个线程。。thread1,thread2。。thread1运行到第5行,然后跳到了thread2。。也运行到第5行之后。。。此时两线程都得到single为空。。。那么就会有两个实例了。。。解决办法。。同步。。

java 代码
  1. public class Singleton{         
  2.        private Singleton(){}         
  3.           
  4.        public synchronized static Singleton getInstance(){      
  5.            if(single==null){      
  6.                 single=new Singleton();      
  7.            }      
  8.            return single;      
  9.        }      
  10.       private static Singleton single;      
  11. }      

 

还有一种方法,提前实例化。。。

java 代码
  1. public class Singleton{         
  2.        private Singleton(){}         
  3.           
  4.        public static Singleton getInstance(){      
  5.                   return single;      
  6.        }      
  7.       private static Singleton single=new Singleton();      
  8. }      

 

此时single的static修饰符有起到另一个作用。。。因为static类型的属性,只在类加载时初始化一次。。。以后不会再初始化了。。确保了只有一个实例。。。

最后一种方法是再head first design pattern上看到的。。double-checked locking。。。

java 代码
  1. public class Singleton{         
  2.        private Singleton(){}         
  3.           
  4.        public static Singleton getInstance(){      
  5.            if(single==null){      
  6.                synchronized(Singleton.class){   
  7.                   if(single==null){      
  8.                      single=new Singleton();      
  9.                   }   
  10.                }   
  11.            }      
  12.            return single;      
  13.        }      
  14.       private volatile static Singleton single;      
  15. }      

 

目前对Singleton的理解就这么多。

 

分享到:
评论
15 楼 congpeixue 2008-10-02  
司徒正美 写道
整理一下!
饿汉式单例类
public class SingleManager {

        private SingleManager() {

                System.out.println("Singleton!");
        }

        private static final SingleManager instance = new SingleManager();

        public static SingleManager getInstance() {

                return instance;
        }

        public static void main(String[] args) {
                SingleManager.getInstance();
        }
}


懒汉式单例类
public class SingleManager {

        private SingleManager() {

                System.out.println("Singleton!");
        }

        private static SingleManager instance = null;

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

        public static void main(String[] args) {
                SingleManager.getInstance();
        }
}

内部类式单例类
public class SingleManager {

    private SingleManager(){
            System.out.println("Singleton!");
    }
    
    static class  SingletonHolder{
            private static SingleManager instance = new SingleManager();
    }
           
    public static SingleManager getInstance(){

            return SingletonHolder.instance;  
    }
    
    public static void main(String[] args){
            SingleManager.getInstance();
    }
}




这样说说就好记多了
14 楼 司徒正美 2008-09-30  
整理一下!
饿汉式单例类
public class SingleManager {

        private SingleManager() {

                System.out.println("Singleton!");
        }

        private static final SingleManager instance = new SingleManager();

        public static SingleManager getInstance() {

                return instance;
        }

        public static void main(String[] args) {
                SingleManager.getInstance();
        }
}


懒汉式单例类
public class SingleManager {

        private SingleManager() {

                System.out.println("Singleton!");
        }

        private static SingleManager instance = null;

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

        public static void main(String[] args) {
                SingleManager.getInstance();
        }
}

内部类式单例类
public class SingleManager {

    private SingleManager(){
            System.out.println("Singleton!");
    }
    
    static class  SingletonHolder{
            private static SingleManager instance = new SingleManager();
    }
           
    public static SingleManager getInstance(){

            return SingletonHolder.instance;  
    }
    
    public static void main(String[] args){
            SingleManager.getInstance();
    }
}

13 楼 lchlrb 2008-09-10  
Qieqie 写道
BlueGuitar 写道
class Singleton{
    class SingletonHolder{
       private static Singleton instance = new Singleton()
    }
    private Singleton(){}
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}




你的代码应该加上对SingletonHolder的static声明。

另外,你是否能解释你提供的代码和以下代码的本质区别,这才是有意思的地方

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


顶下
12 楼 BatiTan 2008-08-28  
恩,基本上说出了该注意的地方~
11 楼 114109796 2007-12-26  
好贴
10 楼 heavens 2007-12-19  
# public class Singleton{        
#        private Singleton(){}        
#          
#        public synchronized static Singleton getInstance(){     
#            if(single==null){     
#                 single=new Singleton();     
#            }     
#            return single;     
#        }     
#       private static Singleton single;     
# }   
就够用了, 没办法做到真的完美。
9 楼 Ivan_Pig 2007-12-19  
唉。。
肤浅了。。。
开始还以为挺简单
8 楼 timerri 2007-12-19  
甭说2个jvm,在同一个jvm中的2个classloader中也不能实现单例。这个模式水很深....
7 楼 Ivan_Pig 2007-12-19  
在两个jvm上也不能保证单例。。。书上也提过。。。
不过没说解决办法。。只说别再两个jvm上运行
6 楼 hantsy 2007-12-18  
the details of DCL is from Bob Lee's Blog:
http://crazybob.org/2007/01/lazy-loading-singletons.html
5 楼 jncz 2007-12-17  
我晕,引乱了
4 楼 jncz 2007-12-17  
BlueGuitar 写道
呵呵,这个要思考一下么,说出来就没意思啦。
加上static之后,就成了静态内部类,保证了在jvm中仅有一个实例。
而且当这么一弄,也会有延迟加载的作用。
3 楼 BlueGuitar 2007-12-17  
呵呵,这个要思考一下么,说出来就没意思啦。
2 楼 Qieqie 2007-12-17  
BlueGuitar 写道
class Singleton{
    class SingletonHolder{
       private static Singleton instance = new Singleton()
    }
    private Singleton(){}
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}




你的代码应该加上对SingletonHolder的static声明。

另外,你是否能解释你提供的代码和以下代码的本质区别,这才是有意思的地方

class Singleton{   
     
    private static Singleton instance = new Singleton();  
    private Singleton(){}   
    public synchronized static Singleton getInstance(){   
        return instance ;   
    }   
}   
1 楼 BlueGuitar 2007-12-17  
Double checked lock也还是不能保证线程安全的。在多核机或者某些jvm实现上,由于指令乱序执行的可能性,还是有可能导致生成多个实例。。。

另外,还有一种singleton的实现方法
class Singleton{
    class SingletonHolder{
       private static Singleton instance = new Singleton()
    }
    private Singleton(){}
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}

好像是这样吧,这个有点意思,呵呵

相关推荐

    design-pattern-java.pdf

    工厂三兄弟之抽象工厂模式(二) 工厂三兄弟之抽象工厂模式(三) 工厂三兄弟之抽象工厂模式(四) 工厂三兄弟之抽象工厂模式(五) 单例模式-Singleton Pattern 确保对象的唯一性——单例模式 (一) 确保对象的...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在帮助开发者深入理解和应用这些模式。下面我们将详细探讨Java设计模式及其在实际开发中的应用。 1. **单例模式(Singleton...

    designPattern-java.pdf

    《Design Patterns Java Companion》一书由James W. Cooper撰写,于1998年出版,是一本针对Java程序员的经典参考书。本书主要介绍了设计模式的基本概念,并深入探讨了几种关键的设计模式。 #### 创建型模式 创建型...

    JAVA design pattern-java设计模式

    总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。

    DesignPattern-master.zip

    "DesignPattern-master.zip"这个压缩包很可能包含了一个关于设计模式的项目或教程资源,用于学习和理解各种设计模式。 在这个“DesignPattern-master”目录中,我们可以期待找到不同类型的资源,如源代码示例、解释...

    Practical Object-Oriented Design With UML - McGraw-Hil

    - **单例模式(Singleton Pattern)**:确保一个类只有一个实例,并提供一个全局访问点。 - **工厂模式(Factory Pattern)**:提供创建对象的接口,但让子类决定实例化哪个类。 - **观察者模式(Observer Pattern)**:...

    Unity-Design-Pattern-master.zip.zip

    本资料“Unity-Design-Pattern-master.zip”聚焦于将设计模式应用于Unity游戏开发,通过实例解析,帮助开发者提升代码质量和可维护性。 在Unity中,设计模式的应用有助于优化项目结构,提高代码复用,以及更好地...

    design-pattern

    ##### 3.4 单例模式 (Singleton Pattern) 单例模式确保一个类只有一个实例,并提供一个全局访问点。 1. **确保对象的唯一性** - **目的**:确保某一个类只有一个实例存在。 - **优点**:节省资源,减少内存开销...

    Design Pattern

    ### 设计模式(Design Pattern) #### 一、概述 设计模式是软件开发中的一种最佳实践,它被广泛应用于解决常见的软件设计问题。设计模式的概念来源于建筑领域的架构模式,特别是受到建筑师克里斯托弗·亚历山大的...

    design-pattern-Java设计模式

    创建型模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),它们关注于如何创建对象。结构型模式包括适配器(Adapter)、桥接(Bridge)、...

    C++11全套设计模式-23种指针的用法(a full DesignPattern -DesignPattern.zip

    本资料包“DesignPattern - DesignPattern.zip”提供了对C++11中23种设计模式的全面讲解,特别是结合指针使用的部分,以下是对这些知识点的详细阐述: 1. **单例模式(Singleton)**:确保一个类只有一个实例,并...

    23种设计模式的C++实现DesignPattern-master.zip

    本资源"23种设计模式的C++实现DesignPattern-master.zip"包含了以下设计模式的C++实现: 1. **创建型模式**: - **单例模式(Singleton)**:保证一个类只有一个实例,并提供全局访问点。 - **工厂方法模式...

    design-pattern-test:设计模式学习

    design-pattern-test 设计模式学习练习 模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns) 序号 模式&描述 包括 1 创建型模式---...

    Design Pattern英文版

    设计模式(Design Pattern)是软件工程中的一种经验总结,它是在特定上下文中为解决常见问题而提出的一套可...通过学习DesignPatterns.pdf文档,开发者能够深入理解这些模式,从而在实际项目中更高效地进行设计和编码。

    DESIGN PATTERN - Pro Design Patterns in Swift

    《Pro Design Patterns in Swift》是一本专注于...通过学习《Pro Design Patterns in Swift》这本书,开发者不仅可以掌握各种设计模式,还能深入了解如何在实际项目中有效地应用它们,从而提升开发效率和软件的稳定性。

    Design*Pattern*Framework*4.5

    "Design*Pattern*Framework*4.5" 可能指的是一个基于 .NET Framework 4.5 的设计模式实现或教程集合。 设计模式是经验丰富的软件开发者的智慧结晶,它们被分为三类:创建型、结构型和行为型。创建型模式涉及对象的...

    design-pattern-in-java

    这个"design-pattern-in-java"项目中的代码示例涵盖了以上所有设计模式,通过实际的Java代码,你可以更直观地理解这些模式的工作原理,并学习如何在自己的项目中应用它们。设计模式的掌握对于提升代码质量、可维护性...

    Design Pattern 简明手册

    ### Design Pattern 简明手册知识点详述 #### 一、接口型(interface)模式 **1. Adapter(适配器模式)** - **定义**:允许一个类接口与另一个不兼容的类接口协同工作。 - **分类**: - **继承型Adapter**:通过...

    design pattern

    在给定的压缩包文件中,包含了九种经典的设计模式示例,它们分别是:单例模式(Singleton)、策略模式(StrategyPattern)、适配器模式(AdapterPattern)、装饰者模式(DecoratorPattern)、抽象工厂模式...

    CoreJava-DesignPattern

    CoreJava-DesignPattern 创意设计模式 -- Abstract Factory - Done -- Builder - Done -- Factory Method -- Object Pool -- Prototype - Done -- Singleton - Done 结构设计模式 -- Adapter -- Bridge -- ...

Global site tag (gtag.js) - Google Analytics