• Java单例的例子



    // Singleton with public final field
    public class Elvis {
        
    public static final Elvis INSTANCE = new Elvis();
        
    private Elvis() {...}

        
    public void leaveTheBuilding() {...}
    }
    // singleton with static factory
    public class Elvis {
        
    private static final Elvis INSTANCE = new Elvis();
        
    private Elvis() {...}
        
    public static Elvis getInstance() {
            
    return INSTANCE;
        }

        
    public void leaveTheBuilding() {...}
    }
    // Enum singleton - the preferred approach
    public enum Elvis {
        INSTANCE;

        
    public void leaveTheBuilding() {...}
    }

     ——————————————————————————————————————————————————————————————————

     附另一篇《参数化的Singleton》

    http://book.51cto.com/art/200812/100191.htm
    很多时候Singleton对唯一实例的构造过程有些"莽撞",因为要么new()一个无参数的构造函数,要么按照指定参数序列构造一个硬编码参数方式的 构造函数,这确实不够灵活,即便可以把很多判断逻辑放到静态构造函数或那个Lazy构造过程,但毕竟这都是在开发过程中定义的。

    C#  硬编码方式实现僵化的参数化Singleton
    public class Singleton
    {
    /// 参数化构造函数
    private string message;
    private Singleton(string message) { this.message = message; }
    public string Message { get { return this.message; } }
        /// 硬编码方式实现的参数化构造函数
    private static Singleton instance;
    public static Singleton Instance
    {
    get
    {
    if (instance == null)
    lock(typeof(Singleton))
    if (instance == null)
    if ((DateTime.Now.DayOfWeek == DayOfWeek.Sunday) ||
    (DateTime.Now.DayOfWeek == DayOfWeek.Saturday))
    instance = new Singleton("weekend");
    else
    instance = new Singleton("work day");
    return instance;
    }
    }
    }

    既然直接硬编码太僵化,很多时候第一直觉是参考"依赖注入"的模式,把需要的参数注入到唯一实例中,如本书第1章介绍的,注入在.NET环境下有四种方式。

    构造函数方式:这种方式在Singleton行不通,因为不允许客户程序控制Singleton类型的实例化过程。

    Setter方式:通过暴露出公共实例属性(public或某些情况下internal),客户程序就可以修改唯一实例的内容,实现参数化不成问题,但同时这种方式有点太过"自由"了,无论哪里的客户程序只要可以看到相关属性就能修改,这很容易失控。这种方式备选。

    接口方式:侵入性太强,而且接口方法的实现全部都在类内部,本身就是硬编码过程,解决不了问题。

    Attributer方式:将通用的Attribte作为桥梁,可以在外部将需要的信息注入Singleton类型,供构造过程参考。这是可行的,但其代价相对于Singleton模式而言有点大。这种方式备选。

    既然外部注入方式感觉上都不是很理想,还是让Singleton"内强"好了,一个不错的选择是借助访问配置系统(配置文件、ini文件或数据库等)。例如上面的那个问题,我们可以通过把message的内容配置在App.Config文件里来解决,其代码如下:

    App.Config
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <appSettings>
    <add key="parameterizedSingletonMessage" value="Hello world"/>
    </appSettings>
    </configuration>
    C#
    public class Singleton
    {
    /// 其他处理
    /// ……

        
    /// 通过访问配置实现的参数化Singleton实例构造
    private static Singleton instance;
    public static Singleton Instance
    {

    get
    {
    if (instance == null)
    lock(typeof(Singleton))
    if (instance == null)
    {
    /// 读取配置并进行实例化
    string key = "parameterizedSingletonMessage";
    string message = ConfigurationManager.AppSettings[key];
    instance = new Singleton(message);
    }
    return instance;
    }
    }
    }
    UnitTest
    Assert.AreEqual<string>("Hello world", Singleton.Instance.Message)
  • 相关阅读:
    SDSF output to PS
    3亿人出走后的中国农村,路在何方?
    oracle function
    C8051特点
    c8051单片机注意事项:
    一个因xdata声明引起的隐含错误
    宏 函数 内联函数inline
    字符串与液晶显示的一个问题
    XON/OFF
    excel之实验数据处理线性拟合
  • 原文地址:https://www.cnblogs.com/cuizhf/p/2173773.html
Copyright © 2020-2023  润新知