まさるblog

越後在住子持ちプログラマー奮闘記 - Author:まさる(高野 将、TAKANO Sho)

目次

Blog 利用状況

ニュース

著書

2010/7発売


Web掲載記事

@IT

.NET開発を始めるVB6プログラマーが知るべき9のこと

CodeZine

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

第1回 3層データバインドを正しく活用しよう(前編)

ブログパーツ


書庫

日記カテゴリ

コミュニティ

デザインパターンを学ぶ~その20:Singletonパターン(3)~

前回は二重チェックを用いた方法で、マルチスレッド下で正常に動作するSingletonを説明しました。

今回はもう一つの、staticコンストラクタを用いた方法を紹介します。

 

それでは、まずはいつものようにコードを掲載します。

C#

/// <summary>
/// ログ出力クラス
/// </summary>
public class SingletonLogger
{
  /// <summary>
  /// ログ出力パス
  /// </summary>
  private string _logPath;

  /// <summary>
  /// プロパティ ログ出力パス
  /// </summary>
  public string LogPath
  {
    get
    {
      return _logPath;
    }
  }

  /// <summary>
  /// コンストラクタ
  /// </summary>
  /// <remarks>new でインスタンス化できないよう、privateでコンストラクタを定義</remarks>
  private SingletonLogger()
  {
    // 重い初期化処理  
    for (var i = 0; i < 1000000000; i++)
    {
    }
    _logPath = DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".log";
  }

  /// <summary>
  /// 自身の唯一のインスタンス
  /// </summary>
  private static SingletonLogger _uniqueLogger = new SingletonLogger();

  /// <summary>
  /// プロパティ インスタンス
  /// </summary>
  /// <remarks>自身の唯一のインスタンスを返す</remarks>
  public static SingletonLogger Instance
  {
    get
    {
      return _uniqueLogger;
    }
  }

  /// <summary>
  /// ログ出力
  /// </summary>
  /// <param name="message"></param>
  public void WriteLog(string message)
  {
    // ログ出力処理
    // ・・・
  }
}

VB

''' <summary>
''' ログ出力クラス
''' </summary>
''' <remarks></remarks>
Public Class SingletonLogger

  ''' <summary>
  ''' ログ出力パス
  ''' </summary>
  ''' <remarks></remarks>
  Private _logPath As String

  ''' <summary>
  ''' プロパティ ログ出力パス
  ''' </summary>
  ''' <value></value>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Public ReadOnly Property LogPath() As String
    Get
      Return _logPath
    End Get
  End Property

  ''' <summary>
  ''' コンストラクタ
  ''' </summary>
  ''' <remarks>new でインスタンス化できないよう、privateでコンストラクタを定義</remarks>
  Private Sub New()
    ' 重い初期化処理  
    For i As Integer = 0 To 1000000000
    Next i
    _logPath = DateTime.Now.ToString("yyyyMMddhhmmssfff") & ".log"
  End Sub

  ''' <summary>
  ''' 自身の唯一のインスタンス
  ''' </summary>
  ''' <remarks></remarks>
  Private Shared _uniqueLogger As New SingletonLogger()

  ''' <summary>
  ''' プロパティ インスタンス
  ''' </summary>
  ''' <value></value>
  ''' <returns></returns>
  ''' <remarks>自身の唯一のインスタンスを返す</remarks>
  Public Shared ReadOnly Property Instance() As SingletonLogger
    Get
      Return _uniqueLogger
    End Get
  End Property

  ''' <summary>
  ''' ログ出力
  ''' </summary>
  ''' <param name="message"></param>
  Public Sub WriteLog(ByVal message As String)
    ' ログ出力処理
    ' ・・・
  End Sub

End Class

では、コードについて説明しましょう。ポイントは

  1. Singleton自身のインスタンス変数の宣言箇所で初期化も行う。
  2. Instanceプロパティでは、チェックを行わないで良い。

の2点です。

前回、前々回の方法ではInstanceプロパティにアクセスしたときに、その中で自身のインスタンスを作成しました。これを遅延初期化といいます。

しかし、今回は変数宣言時に初期化しており、このコードが実行されるのは、初めてSingletonのメンバにアクセスしようとした際に実行される、staticコンストラクタ(クラスコンストラクタ)の内部になります。そして、CLRではstaticコンストラクタはスレッドセーフであることが保証されるため、必ず1つしかインスタンスが作られないことになります。

ですので、2.のようにInstanceプロパティ内でのチェックは不要になります。

 

ところで、この方法は二重チェックの方法に比べて単純ですし、積極的に利用したほうが良いと感じるかもしれません。ただ一点、Singletonのメンバにアクセスしようとした際、それがInstanceプロパティでない場合でも初期化がおこなわれるため、実行時のオーバーヘッドが問題になる場合は使うべきでないときもあります。

が、最近はマシンの性能も上がっていますし、このオーバーヘッドはほぼ無視して良いでしょう。

 

ということで、Singletonについては、複雑になる二重チェックの方法ではなく、今回のstaticコンストラクタで初期化を行う手法を使っておけば、ほぼ間違いないと考えて良いのではないでしょうか。

 

さて、Singletonについて3回にわたりお送りしてきました。次回からはCommandパターンを取り上げようと思います。

投稿日時 : 2008年8月10日 23:13

Feedback

# re: デザインパターンを学ぶ~その20:Singletonパターン(3)~ 2008/08/11 8:04 さかもと

本にしたいなー、本にしてほしいなー・・・。

# re: デザインパターンを学ぶ~その20:Singletonパターン(3)~ 2008/08/11 15:35 まさる

>画伯
つ【プリントアウト】

#正直な話、私なんかよりよっぽどしっかりまとめてあるところも多いと思いますが。

# stromectol for humans 2021/09/28 20:43 MarvinLic

ivermectin price canada http://stromectolfive.online# ivermectin brand

# ivermectin lice 2021/10/31 14:51 DelbertBup

generic ivermectin for humans http://stromectolivermectin19.com/# buy ivermectin cream
ivermectin 1 topical cream

# ivermectin nz 2021/11/04 1:02 DelbertBup

ivermectin 8 mg http://stromectolivermectin19.com/# ivermectin over the counter
ivermectin cream cost

# how many sildenafil 20mg can i take 2021/12/07 16:04 JamesDat

http://viasild24.com/# sildenafil 20 mg tablet uses

# careprost bimatoprost ophthalmic best price 2021/12/11 18:23 Travislyday

http://bimatoprostrx.com/ careprost bimatoprost for sale

# bimatoprost generic 2021/12/12 13:07 Travislyday

http://plaquenils.online/ plaquenil headache

# baricitinib price https://baricitinibrx.com
where to buy baricitinib
2021/12/12 16:32 Buksdldj

baricitinib price https://baricitinibrx.com
where to buy baricitinib

# buy bimatoprost 2021/12/13 8:54 Travislyday

http://plaquenils.online/ cost of plaquenil in us

# bimatoprost buy 2021/12/14 4:47 Travislyday

https://bimatoprostrx.com/ buy careprost in the usa free shipping

# ivermectin 5 mg 2021/12/18 12:38 Eliastib

uealgy https://stromectolr.com ivermectin 1 cream

# buy cheap doxycycline https://doxycyline1st.com/
doxycycline 100mg online 2022/02/26 17:53 Jusidkid

buy cheap doxycycline https://doxycyline1st.com/
doxycycline 100mg online

# lasix uses https://buylasix.icu/
buy furosemide online 2022/06/25 1:11 LasixRx

lasix uses https://buylasix.icu/
buy furosemide online

# buy clomid online https://clomidonline.icu/ 2022/07/12 23:56 Clomidj

buy clomid online https://clomidonline.icu/

# Сможет ли человечество направить свое влечение к агрессии на путь культурного изменения, на путь самосовершенствования? Сейчас люди легко и быстро способны истребить друг друга. Отсюда – беспокойства, страхи, неврозы. Остается надеяться только на созид 2023/03/28 15:51 Сможет ли человечество направить свое влечение к

Сможет ли человечество направить свое влечение
к агрессии на путь культурного
изменения, на путь самосовершенствования?
Сейчас люди легко и быстро способны истребить друг друга.
Отсюда ? беспокойства, страхи, неврозы.
Остается надеяться только на созидательную
силу любви, на торжество неизменного Эроса.
Что делать

# Сможет ли человечество направить свое влечение к агрессии на путь культурного изменения, на путь самосовершенствования? Сейчас люди легко и быстро способны истребить друг друга. Отсюда – беспокойства, страхи, неврозы. Остается надеяться только на созид 2023/03/28 15:51 Сможет ли человечество направить свое влечение к

Сможет ли человечество направить свое влечение
к агрессии на путь культурного
изменения, на путь самосовершенствования?
Сейчас люди легко и быстро способны истребить друг друга.
Отсюда ? беспокойства, страхи, неврозы.
Остается надеяться только на созидательную
силу любви, на торжество неизменного Эроса.
Что делать

# Сможет ли человечество направить свое влечение к агрессии на путь культурного изменения, на путь самосовершенствования? Сейчас люди легко и быстро способны истребить друг друга. Отсюда – беспокойства, страхи, неврозы. Остается надеяться только на созид 2023/03/28 15:51 Сможет ли человечество направить свое влечение к

Сможет ли человечество направить свое влечение
к агрессии на путь культурного
изменения, на путь самосовершенствования?
Сейчас люди легко и быстро способны истребить друг друга.
Отсюда ? беспокойства, страхи, неврозы.
Остается надеяться только на созидательную
силу любви, на торжество неизменного Эроса.
Что делать

# Сможет ли человечество направить свое влечение к агрессии на путь культурного изменения, на путь самосовершенствования? Сейчас люди легко и быстро способны истребить друг друга. Отсюда – беспокойства, страхи, неврозы. Остается надеяться только на созид 2023/03/28 15:51 Сможет ли человечество направить свое влечение к

Сможет ли человечество направить свое влечение
к агрессии на путь культурного
изменения, на путь самосовершенствования?
Сейчас люди легко и быстро способны истребить друг друга.
Отсюда ? беспокойства, страхи, неврозы.
Остается надеяться только на созидательную
силу любви, на торжество неизменного Эроса.
Что делать

# prescriptions online https://pillswithoutprescription.pro/# 2023/05/15 5:19 PillsPresc

prescriptions online https://pillswithoutprescription.pro/#

# buying ed pills online https://edpillsotc.store/# - otc ed pills 2023/10/08 2:52 EdPills

buying ed pills online https://edpillsotc.store/# - otc ed pills

# how can i get valtrex https://valtrex.auction/ generic valtrex from india 2023/10/24 23:45 Valtrex

how can i get valtrex https://valtrex.auction/ generic valtrex from india

タイトル  
名前  
Url
コメント