• 【java设计模式】【创建模式Creational Pattern】单例模式Singleton Pattern


    1 //饿汉式:资源利用率较低(无论是否需要都会创建),性能较高(使用前无需判断实例是否存在,可直接使用)
    2 public class EagerSingleton{
    3     private static final EagerSingleton instance=new EagerSingleton();
    4     private EagerSingleton(){}
    5     public static EagerSingleton getInstance(){
    6         return instance;
    7     }
    8 }
     1 //懒汉式:资源利用率较高(需要时才创建),性能较低(需要判断实例是否存在)
     2 public class LazySingleton{
     3     private static LazySingleton instance;
     4     private LazySingleton(){}
     5     synchronized/*同步很重要,保证多线程时安全*/ public static LazySingleton getInstance(){
     6         if(instance==null){
     7             instance=new LazySingleton(); 
     8         }
     9         return instance;
    10     }
    11 }
     1 //这是个错误示例:双重检查成例对java语言编译器不成立,在线程1进入第2个if时,引用instance被创建,
     2 //但可能未来得及被实例化,此时线程2在第1个if时判断引用instance不为空则直接返回instance,但JDK不允许
     3 //返回一个没有实例化的对象,所有会导致系统崩溃。
     4 public class LazySingleton{
     5     private static LazySingleton instance;
     6     private LazySingleton(){}
     7     public static LazySingleton getInstance(){
     8         if(instance==null){
     9             synchronized(LazySingleton.class){
    10                 if(instance==null){
    11                     System.out.println("LazySingleton.getInstance()");
    12                     instance=new LazySingleton(); 
    13                 }
    14             }
    15         }
    16         return instance;
    17     }
    18 }
     1 package com.tn.pattern;
     2 
     3 import java.util.HashMap;
     4 
     5 public class Client {
     6     public static void main(String[] args) throws Exception {
     7         RegSingleton.getInstance(null).print();
     8         RegSingletonChild.getInstance().print();
     9     }
    10 }
    11 
    12 //登记式
    13 class RegSingleton{
    14     private static HashMap singletons=new HashMap();
    15     static{
    16         RegSingleton instance=new RegSingleton();
    17         singletons.put(instance.getClass().getName(), instance);
    18     }
    19     
    20     protected RegSingleton(){}
    21     
    22     public static RegSingleton getInstance(String name){
    23         if(name==null)
    24             name="com.tn.pattern.RegSingleton";
    25         if(singletons.get(name)==null){
    26             try {
    27                 singletons.put(name, Class.forName(name).newInstance());
    28             } catch (Exception e) {
    29                 e.printStackTrace();
    30             } 
    31         }        
    32         return (RegSingleton)singletons.get(name);        
    33     }
    34     public void print(){
    35         System.out.println("RegSingleton.print()");
    36     }
    37 }
    38 
    39 class RegSingletonChild extends RegSingleton{
    40     public RegSingletonChild(){}
    41     
    42     public static RegSingletonChild getInstance(){
    43         return (RegSingletonChild)RegSingleton.getInstance("com.tn.pattern.RegSingletonChild");
    44     }
    45     
    46     public void print(){
    47         System.out.println("RegSingletonChild.print()");
    48     }
    49 }
  • 相关阅读:
    python笔记第二节
    python笔记第一节
    hadoop 家族生态圈 小结
    JDBC:impala 连接DEMO
    关于excel表格的导入导出的工具类。(java 反射 excel)
    简单写了一个类似全文检索的帮助类。
    关于框架SSM中文乱码问题总结
    关于SpringMVC, bean对象中含有Date型变,改如何接收数据的问题。
    Nlog
    java手动编译
  • 原文地址:https://www.cnblogs.com/xiongjiawei/p/6922889.html
Copyright © 2020-2023  润新知