この記事では、作成モードで 3 番目によく使用されるモードであるシングルトン モードについて説明します。まずは2枚の写真を見て、モードの種類を見直し、記憶を深めるのが先だ。
意味:
シングルトン モード:クラスにインスタンスが 1 つだけあることを確認し、この一意のインスタンスにアクセスするためのグローバル アクセス ポイントを提供します。
シングルトン パターン:クラスにインスタンスが 1 つだけあることを確認し、そのインスタンスへのグローバルアクセス ポイントを提供します。
要点:
クラスはインスタンスを 1 つだけ持つことができます
このインスタンスは自分で作成する必要があります
このインスタンスをシステム全体に提供する必要があります
最も単純な実際的なケースは、Windows オペレーティング システムのタスク マネージャーと、負荷分散の独自性です。
構造:
分類:
ハングリー スタイルのシングルトン クラス:複数のスレッドによる同時アクセスの問題を考慮する必要がありません。呼び出し速度と応答時間は遅延スタイルのシングルトンよりも優れています。リソースの使用効率は遅延スタイルのシングルトンほど良くありません。システムの読み込み時間は遅くなる可能性があります。より長いです
class EagerSingleton
{
private static EagerSingleton instance = new EagerSingleton();
private EagerSingleton() { }
public static EagerSingleton GetInstance()
{
return instance;
}
}
遅延スタイルのシングルトン クラス:遅延読み込みを実装します。複数のスレッドが同時にアクセスする問題に対処する必要があります。二重チェック ロックなどのメカニズムで制御する必要があり、システム パフォーマンスにある程度の影響を与えます。
class Singleton
{
private static Singleton instance=null;
private Singleton()
{
}
public static Singleton GetInstance()
{
if(instance==null)
instance=new Singleton();
return instance;
}
}
さまざまなプロセスによる繰り返しの呼び出しを防ぐための遅延スタイル。ロックを二重チェックできます。
class LazySingleton
{
private static LazySingleton instance = null;
//程序运行时创建一个静态只读的辅助对象
private static readonly object syncRoot = new object();
private LazySingleton() { }
public static LazySingleton GetInstance()
{
//第一重判断,先判断实例是否存在,不存在再加锁处理
if (instance == null)
{
//加锁的程序在某一时刻只允许一个线程访问
lock(syncRoot)
{
//第二重判断
if(instance==null)
{
instance = new LazySingleton(); //创建单例实例
}
}
}
return instance;
}
}
クラス図:
適用性:
システムに
必要なインスタンス オブジェクトは 1 つだけ
、またはリソースの消費が多すぎるため
、作成できるオブジェクトは 1 つだけです
クライアント呼び出しクラスの 1 つのインスタンスは
1 つのパブリック アクセス ポイントのみを使用でき
、そのインスタンスにはパブリック アクセス ポイント以外の方法でアクセスできません。
アドバンテージ:
固有のインスタンスへの制御されたアクセスを提供します
システムリソースを節約し
、
システムパフォーマンスを向上させることができます
可変数のインスタンスを許可 (
複数のインスタンス クラス
)
欠点:
スケーリングが難しい
(抽象化レイヤーの欠如)
シングルトンクラスに
は責任が多すぎる
自動ガベージ コレクション メカニズムにより、共有シングルトン オブジェクトの状態が
失われる可能性があります。
ケース 1: (.NET コード)
using System;
namespace SingletonSample
{
class Program
{
static void Main(string[] args)
{
//创建四个LoadBalancer对象
LoadBalancer balancer1,balancer2,balancer3,balancer4;
balancer1 = LoadBalancer.GetLoadBalancer();
balancer2 = LoadBalancer.GetLoadBalancer();
balancer3 = LoadBalancer.GetLoadBalancer();
balancer4 = LoadBalancer.GetLoadBalancer();
//判断服务器负载均衡器是否相同
if (balancer1 == balancer2 && balancer2 == balancer3 && balancer3 == balancer4)
{
Console.WriteLine("服务器负载均衡器具有唯一性!");
}
//增加服务器
balancer1.AddServer("Server 1");
balancer1.AddServer("Server 2");
balancer1.AddServer("Server 3");
balancer1.AddServer("Server 4");
//模拟客户端请求的分发,如果输出结果全为同一个server,可以将i适当放大,例如改为"i < 100"
for (int i = 0; i < 10; i++)
{
string server = balancer1.GetServer();
Console.WriteLine("分发请求至服务器: " + server);
}
Console.Read();
}
}
}
using System;
using System.Collections;
namespace SingletonSample
{
class LoadBalancer
{
//私有静态成员变量,存储唯一实例
private static LoadBalancer instance = null;
//服务器集合
private ArrayList serverList = null;
//私有构造函数
private LoadBalancer()
{
serverList = new ArrayList();
}
//公有静态成员方法,返回唯一实例
public static LoadBalancer GetLoadBalancer()
{
if (instance == null)
{
instance = new LoadBalancer();
}
return instance;
}
//增加服务器
public void AddServer(string server)
{
serverList.Add(server);
}
//删除服务器
public void RemoveServer(string server)
{
serverList.Remove(server);
}
//使用Random类随机获取服务器
public string GetServer()
{
Random random = new Random();
int i = random.Next(serverList.Count);
return serverList[i].ToString();
}
}
}
ケース 2: (JAVA コード)
public class Singleton {
private static Singleton sing;
private Singleton() {
}
public static Singleton getInstance() {
if (sing == null) {
sing = new Singleton();
}
return sing;
}
}
public class Test {
public static void main(string[] args) {
Singleton sing = Singleton.getInstance();
Singleton sing2 = Singleton.getInstance();
System.out.println(sing);
System.out.println(sing2);
}
}