黑马程序员:Java设计模式之单例设计模式的实现

来源:互联网 发布:机房环境监控软件 编辑:程序博客网 时间:2024/06/16 19:20
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

设计模式:解决某一类问题最行之有效的方法。

Java中有23种设计模式,单例设计模式只是其中一种

单例设计模式:解决一个类在内存中只存在一个对象

如何保证一个类在内存中只存在一个对象?

  • 为了避免调用者建立多个对象,先禁止调用者建立该对象
  • 为了方便调用者使用该类对象,在本类中建立一个私有对象并提供调用者一个访问方法

代码实现过程示例:

  • 第一种方式:先初始化对象,称为饿汉式,开发一般用这种形式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    class Single
    {
        private int age;
        public void setAge(int age)
        {
            this.age = age;
        }
        public int getAge()
        {
            return this.age;
        }
        private Single(){}  //将构造函数私有化,禁止其他类创建Single对象
        private static final Single s = new Single(); //本类中自定义的一个对象
        public static Single getInstance()  //为其他类提供访问Single对象的方法,因不能通过对象的方式访问,故只能通过静态化方法通过类直接访问。
        {
            return s;
        }
    }
     
    class SingleDemo
    {
        public static void main(String[] args)
        {
            Single s = Single.getInstance();
            Single s1 = Single.getInstance();
            s.setAge(30);
            System.out.println(s1.getAge()); //结果为30,证明内存中只存在一个对象,否则返回结果为0.
        }
    }

  • 第二种方式:对象在方法被调用时,才初始化,也叫做对象的延时加载。称为懒汉式
    懒汉式单例设计模式的写法常在面试中出现,并会提出解决懒汉式CPU未及时处理导致创建对对象问题的方法。使用synchronized关键字解决。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    class Single
    {
        private int age;
        public void setAge(int age)
        {
            this.age = age;
        }
        public int getAge()
        {
            return this.age;
        }
        private Single(){}  //将构造函数私有化,禁止其他类创建Single对象
        private static Single s = null;
        public static Single getInstance()  //为其他类提供访问Single对象的方法,因不能通过对象的方式访问,故只能通过静态化方法通过类直接访问。
        {
             
            /*
            if(s==null)
                //若CPU处理在这个位置停止处理的时候,另一个用户进来很可能创建对象,而原来停止处理的用户恢复之后又会创建对象。导致内存中不仅仅存在一个对象。
                s = new Single(); //当调用方法时,才创建对象,并把对象内存地址值赋给s
            return s;
            */
            //解决上面代码中有可能出现的问题:当多用户使用该方法时,CPU来不及处理导致创建多个对象
            if(s==null)
            {
                synchronized(Single.class)  //synchronized 同步锁的功能,当使用该关键字的范围内有用户在处理数据时,另一个用户不允许进入处理。
                {
                    if(s==null)
                        s = new Single();
                }
            }
            return s;    
        }
    }
     
    class SingleDemo
    {
        public static void main(String[] args)
        {
            Single s = Single.getInstance();
            Single s1 = Single.getInstance();
            s.setAge(30);
            System.out.println(s1.getAge()); //结果为30,证明内存中只存在一个对象,否则返回结果为0.
        }
    }

以上代码通过思想形式展现如下:

  • 将构造函数私有化:防止调用者创建该类对象
  • 在类中创建一个本类对象
  • 提供一个方法让调用者可以获取到该对象
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
原创粉丝点击