zoukankan      html  css  js  c++  java
  • 单例模式(Singleton Pattern)

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace DesignPattern.SingletonPattern
     7 {
     8     /// <summary>
     9     /// 地球只有一个吧??所以单例一个地球
    10     /// </summary>
    11     class Earth
    12     {
    13         /// <summary>
    14         /// 在大多数情况下,静态初始化是在 .NET 中实现 Singleton 的首选方法。
    15         /// </summary>
    16         private static readonly Earth singleton = new Earth();
    17 
    18         private Earth()
    19         {
    20         }
    21 
    22         public static Earth getEarth()
    23         {
    24             return singleton;
    25         }
    26 
    27         /// <summary>
    28         /// 公开一个全局方法,下雨~!
    29         /// </summary>
    30         public void Rain()
    31         {
    32             Console.WriteLine("哗啦啦啦天在下雨!!!!");
    33         }
    34 
    35     }
    36 
    37     /// <summary>
    38     /// 线程安全的单例,延迟加载,双重校验锁
    39     /// </summary>
    40     public class Singleton
    41     {
    42         private static Singleton singleton = null;
    43         static readonly object lazylock = new object();
    44         public static Singleton getInstance()
    45         {
    46             if (singleton == null)
    47             {
    48                 lock (lazylock)
    49                 {
    50                     if (singleton == null)
    51                     {
    52                         singleton = new Singleton();
    53                     }
    54                 }
    55             }
    56             return singleton;
    57         }
    58     }
    59 }
    Earth earth = Earth.getEarth();
    earth.Rain();

    优点:
    减少内存开支
    减少性能开销
    避免资源多重占用
    拥有全局访问点

    缺点:
    一般没有接口,难以扩展。
    测试不利,没有接口无法mock

    使用场景:
    整个项目需要一个共享访问点,共享数据
    创建的对象需要消耗资源过多
    需要定义大量的静态常量和方法(工具类)

    最佳实践:
    如果单例在内存长久不使用,则会被认为是垃圾而销毁,可以由容器管理单例的生命周期,也可以记录状态变化,确保重新初始化之后获得销毁前的数据,,避免丢失。

  • 相关阅读:
    iPhone开发之多线程使用
    iPhone开发之启动画面及动画
    Keyboard 遮挡 UITextField
    iPhone发布之图标大小和设置
    Linux文件目录及其作用
    UIView设置背景图片
    通过点击事件轮换隐藏和显示导航栏
    内存检测
    iPhone开发之自定义柱状图
    给UIImageView添加点击事件
  • 原文地址:https://www.cnblogs.com/leestar54/p/5800161.html
Copyright © 2011-2022 走看看