分享

Java 设计模式

 chfxh 2017-07-25

本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.csdn.net/Rozol/article/details/76037457


类在内存中的对象只有一个
单例模式分为: 饿汉式 / 懒汉式 / 静态内部类 / 枚举

饿汉式

public class 饿汉式 { private static final 饿汉式 instance = new 饿汉式(); private 饿汉式(){} public static 饿汉式 getInstance(){ return instance; } public void show(){ System.out.println('饿汉式'); }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 在一开始直接创建对象, 而不管你是否用的上该对象, 比较浪费内存;
  • 优点是, 线程安全.

懒汉式

public class 懒汉式 { private static 懒汉式 instance; private 懒汉式(){} public static 懒汉式 getInstance(){ if (instance == null){ synchronized (懒汉式.class){ if (instance == null){ instance = new 懒汉式(); } } } return instance; } public void show(){ System.out.println('懒汉式'); }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 在你真正用时才创建对象, 比饿汉式节省内存.

静态内部类

public class 静态内部类 { private 静态内部类(){} public static 静态内部类 getInstance(){ return Instance.instance; } /** * 静态内部类 * @author Luzhuo */ private static class Instance{ private static final 静态内部类 instance = new 静态内部类(); } public void show(){ System.out.println('静态内部类'); }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • static final 只允许被赋值一次, 该对象被赋值后, 直接调用而不会再次创建对象. 且该对象不能再被赋值修改.

枚举

public enum 枚举 { Instance; public void show(){ System.out.println('枚举'); }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 枚举类型是静态常量, 隐式地用static final修饰过;
  • 源码中使用static{}创建枚举类对象, 所以也属于饿汉式的一种.

使用

public class Test { public static void main(String[] args) { // 饿汉式 饿汉式(); // 懒汉式 懒汉式(); // 静态内部类 静态内部类(); // 枚举 枚举(); } public static void 饿汉式(){ 饿汉式 obj1 = 饿汉式.getInstance(); 饿汉式 obj2 = 饿汉式.getInstance(); obj1.show(); obj2.show(); System.out.println(obj1 == obj2); //true } public static void 懒汉式(){ 懒汉式 obj1 = 懒汉式.getInstance(); 懒汉式 obj2 = 懒汉式.getInstance(); obj1.show(); obj2.show(); System.out.println(obj1 == obj2); //true } public static void 静态内部类(){ 静态内部类 obj1 = 静态内部类.getInstance(); 静态内部类 obj2 = 静态内部类.getInstance(); obj1.show(); obj2.show(); System.out.println(obj1 == obj2); //true } private static void 枚举() { 枚举 obj1 = 枚举.Instance; 枚举 obj2 = 枚举.Instance; obj1.show(); obj2.show(); System.out.println(obj1 == obj2); // true }}
  • 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
  • 46
  • 47

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多