• 设计模式—单例模式1·思维过程


    前言

        本文介绍设计模式中的单例模式的思维过程。设计模式是一种思想,在各种编程语言的编程中都可以使用,比如javaC#。这里只是以java语言为例。顾名思义,单例模式在java中的意思就是不管程序怎么运行,都只会有一个对象。比如对类Student使用了单例模式,那么,不管在其他的类中怎么使用Student类的对象,都应该是同一个。下面,就顺着这个思路,来探讨怎么在java中使用单例模式。

    一、思维过程

    1.1、构造方法私有化

        既然目标是整个程序中只能创建一个对象,那么在其他类中任意创建对象的这种行为肯定是不允许的。比如想要将Student类设定成单例模式,那么下面这种情况肯定不允许:

    class Test{
            
                Student s1 = new Student();
                Student s2 = new Student();
            
    }
    class Student {
            
    }

      很明显,上面给了其他类创建Student对象的机会,那么就会产生无数个对象。所以想要创建单例模式,第一件事就是不能给别的类new自己的机会。要做到这一点很简单,只要将自己的构造方法声明成private的即可,这样,当别的类想要new自己的时候,会报错,情况如下图所示:

     

     

    1.2、自己new自己

        通过构造方法私有化,现在外部类不能new自己了,但是目标是单例,也就是只能创建一个对象,现在外面一个对象都创建不了了,所以此时我们只能自己(本文中就是指Student类)来创建自己,代码如下所示:

    class Student {
        
            Student s = new Student();
            private Student() {
            }
    }

    1.3、提供方法给外部使用

        通过1.2中的操作,现在可以创建出Studnet类的对象了,且只会创建一个(因为只会new一次),也就达到了单例的要求。但是要想给外部使用,还需要提供一个方法(就像提供get方法给外部访问自己私有成员变量的机会一样),将自己创建的对象返回回去。既然要给外部调用,那么这个方法就应该是public的。

        代码如下所示:

    class Student {
        
                Student s = new Student();
                private Student() {
            }    
        
            public Student getInstance() {
            
                return s;
            }
    }

        但是,现在外部还是使用不了getInstance()方法,因为getInstance()方法需要Student类的对象才能调用,但是外部现在创建不了 Studnet类的对象,所以现在要做的就是将该方法改为static的,另外,既然方法变为了staitc的,那么其中使用的变量也应该变成static的,代码如下所示:

    class Student {
        
            private static Student s = new Student();
            private Student() {
            }
        
            public static Student getInstance() {
            
                return s;
            }    
    }

     

    1.4、小结

        通过上面三步,现在外部想要创建Studnet类的对象,就只能通过调用Student类的静态方法getInstance(),getInstance()方法返回的又是只会创建一次的Student类对象,这样,就实现了单例模式。

      单例模式创建的三部曲:

        1.构造方法私有化

        2.自己创建自己的对象

        3.提供static的方法返回自己创建的对象

    二、测试

        代码:

        获取两个Studnet类的对象,如果是单例,那么这两对象s1s2的地址应该是相等的,也就是输出结果是true,否则是false

    public class Test{
            
            public static void main(String[] args) {
                    
                Student s1 = Student.getInstance();
                Student s2 = Student.getInstance();
                System.out.println(s1==s2);            
            }    
            
    }
    class Student {
        
            private static Student s = new Student();
            private Student() {        
            }    
            public static Student getInstance() {    
                return s;
            }
    }

        输出结果:

         本文介绍的是单例模式的思维方式,在单例模式2中介绍单例模式的几种实现方式(也在设计模式分类中)。

       链接:http://www.cnblogs.com/Bingfengwangzuo/p/6851452.html

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    VC连接数据库方式
    vc中有关数据类型的转换
    获得MFC窗口指针方法总结
    Windows 中绘图以及Windows 的图形设备接口(GDI )
    C#访问远程共享加锁文件夹
    C#操作注册表全攻略
    学习asp.net比较完整的流程
    sogou rank查询接口
    jquery星级插件、支持页面中多次使用
    防止网页被嵌入框架的js代码
  • 原文地址:https://www.cnblogs.com/Bingfengwangzuo/p/6848719.html
Copyright © 2020-2023  润新知