单例的设计模式代码演示 + 内存分析图详解

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

java中有23中设计模式。

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

想要保证对象的唯一性:

  1.为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象。

  2.还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。

  3.为了方便其他程序对自定义对象的访问,可以对外提供一个访问方式。

这三步怎么用代码来体现呢?

  1.将构造函数私有化。

  2.在类中创建一个本类对象。

  3.提供一个公共的方法可以获取到该对象。

1、饿汉式:先初始化对象

 1 package com.wisezone.day06;
 2 
 3 /**
 4  * java中有23种对象设计模式 
 5  * 单例设计模式:解决一个类中只存在一个对象
 6  * @author 王东海 @date. 2016年8月30日
 7  * @version v1.0
 8  */
 9 // 饿汉式:先初始化对象。
10 class Single {
11     
12     // 1、将构造器私有化,不能在类的外部创建该类的对象
13     private Single() {}
14 
15     // 2、创建对象,私有的,只能在类的内部访问
16     private static Single s = new Single();
17 
18     // 3、提供一个公共方法可以获取到对象
19     public static Single getInstance() {
20         return s;
21     }
22 }
23 
24 public class SingleDemo {
25     public static void main(String[] args) {
26         //构造函数私有化后,我们就需要使用:类名.方法
27         Single s1 = Single.getInstance();
28         Single s2 = Single.getInstance();
29         System.out.println(s1);//com.wisezone.day06.Single@17b68215
30         System.out.println(s2);//com.wisezone.day06.Single@17b68215
31     }
32 }

在内存中分析

 

2、懒汉式 

 1 package com.wisezone.day06;
 2 
 3 /**
 4  * java中有23种对象设计模式 
 5  * 单例设计模式:解决一个类中只存在一个对象
 6  * @author 王东海 @date. 2016年8月30日
 7  * @version v1.0
 8  */
 9 // 懒汉式:对象在调用时,才初始化,也称为对象的延时加载。
10 class Single2 {
11     
12     // 1、将构造器私有化,不能在类的外部创建该类的对象
13     private Single2() {}
14 
15     // 2、先声明类的引用
16     private static Single2 ss = null;
17 
18     // 3、提供一个公共方法可以访问类的实例
19     public static Single2 getInstance() {
20         
21         //3.1如果类的实例未创建,那些先要创建,然后返回给调用者:本类。因此,需要static 修饰。
22         if (ss == null) {
23             ss = new Single2();
24         }
25         //3.2 若有了类的实例,直接返回给调用者。
26         return ss;
27     }
28 }
29 
30 public class SingleDemo2 {
31     
32     public static void main(String[] args) {
33         //构造函数私有化后,我们就需要使用:类名.方法
34         Single2 ss1 = Single2.getInstance();
35         Single2 ss2 = Single2.getInstance();
36         System.out.println(ss1);//com.wisezone.day06.Single2@28084850
37         System.out.println(ss2);//com.wisezone.day06.Single2@28084850
38     }
39 }

 在内存中分析

 

注意:开发时,建议使用饿汉式。

因为它获取实例的步骤简单,所以它是线程安全的。

posted @ 2017-04-15 20:08  程序员的世界。。。  阅读(224)  评论(0编辑  收藏  举报