素人の団結C#のデザインパターン - シングルトン

シングルトン


シングルトン(Singletonパターン)は、最も簡単なデザインパターンデザインパターンの一つです。デザインパターンのこのタイプのオブジェクトを作成するための最良の方法を提供し、スキーマを作成します属します。

このモデルは、単一のオブジェクトが作成されていることを保証しながら、独自のオブジェクトを作成するための責任がある単一のクラスが含まれます。このクラスは、直接アクセスできるオブジェクト、オブジェクトクラスのインスタンスにアクセスするための唯一の方法を提供します。

                                                                                                                                                                                                           

注意:

1、一つだけシングルトンクラスのインスタンス。
2、シングルトンクラスには、独自のインスタンスを作成する必要があります。
3、シングルトンクラスは、他のすべてのオブジェクトにこの例を提供しなければなりません。
はじめに
目的:クラスのインスタンスを1つだけ確実にし、それをアクセスするためのグローバルアクセスポイントを提供します。

主に解決するために:頻繁に作成し、破壊するために使用グローバルクラスを。

ときに使用する:あなたは、システムリソースを節約するために、インスタンスの数を制御したいとき。

解決方法:その後、作成されていない場合には、返された場合、システムはすでに、この単一のケースを持っているかどうかを判断します。

キーコード:コンストラクタがプライベートです。

応用例:1は、当事者は一つだけ会長を持つことができます。2は、Windowsが同時に現象のファイルを操作すること必然的に複数のプロセスまたはスレッド、マルチプロセス、マルチスレッド、ときにファイル操作で、すべてのファイルの処理には、固有のインスタンスによって行われなければなりません。出力の両方が同一のドキュメントプリンタを処理しないとき、コンピュータ、プリンタなどの単一マネージャ実施の形態では、二つを有するように図3に示すように、いくつかのデバイスは、しばしば設計されています。

利点:1、一つだけのメモリで、(そのような管理のホームページキャッシュの学校など)は、特に頻繁に作成および破棄のインスタンスをメモリのオーバーヘッドを削減します。2.(ファイル書き込み操作など)リソースの複数の割り当てを避けてください。

短所:なしインタフェース、継承されていない、との競合単一責任の原則は、クラスだけではないインスタンス化する方法を外側に、内部ロジックを心配するべきではありません。

使用する:1、固有のシリアル番号の生産を必要とします。2、WEBカウンターは、常に、データベースリガの先天的キャッシュされた単一の例をリフレッシュする時間がありません。図3に示すように、目的は、このようなようにI / Oデータベースへの接続となどのリソースの過剰消費を作成する必要があります。

注意:のgetInstance()メソッドは複数回インスタンス化される原因インスタンスに複数のスレッドを防ぐために(Singleton.class)は、同期ロック同期を使用する必要があります。

実現


私たちは、SingleObjectクラスを作成します。SingleObjectクラスは、独自のプライベートコンストラクタと静的インスタンスを持っています。

SingleObjectクラスは、その静的インスタンスを取得するために、外の世界のために、静的メソッドを提供します。SingletonPatternDemoは、私たちのデモクラスはSingleObjectオブジェクトを取得するSingleObjectクラスを使用しています。

ステップ1
怠惰な人間- 1.クラスシングルトンを作成します。


#region 模块信息
// **********************************************************************
// Copyright (C) 2018 Blazors
// Please contact me if you have any questions
// File Name:             SingleObject
// Author:                romantic123fly
// WeChat||QQ:            at853394528 || 853394528 
// **********************************************************************
#endregion
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
 *饿汉式
是否 Lazy 初始化:否
是否多线程安全:是
实现难度:易
描述:这种方式比较常用,但容易产生垃圾对象。
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
它基于 classloder 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,
虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 
但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。
*/
namespace SingleMode
{
    public class SingletonOne
    {
        private static SingletonOne instance = new SingletonOne();
        public static SingletonOne GetInstance()
        {
            return instance;
        }
        //让构造函数为 private,这样该类就不会被实例化
        private SingletonOne() { }
        public void Print()
        {
            Debug.Log("我是饿汉式单例,线程安全");
        }
    }
}
#region 模块信息
// **********************************************************************
// Copyright (C) 2018 Blazors
// Please contact me if you have any questions
// File Name:             SingletonTwo
// Author:                romantic123fly
// WeChat||QQ:            at853394528 || 853394528 
// **********************************************************************
#endregion
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace SingleMode
{
    public class SingletonTwo
    {
        /*
         * 懒汉式,线程不安全
         是否 Lazy 初始化:是
         是否多线程安全:否
         实现难度:易
         描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。
         因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
         这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。
         */
 
        private static SingletonTwo instance;
        public static SingletonTwo GetInstance()
        {
            if (instance == null)
            {
                instance = new SingletonTwo();
            }
            return instance;
        }
        //让构造函数为 private,这样该类就不会被实例化
        private SingletonTwo() { }
        public void Print()
        {
            Debug.Log("我是懒汉式单例,多线程不安全");
        }
    }
}

ステップ2

シングルトンクラスから一意のオブジェクトを取得します。

#region 模块信息
// **********************************************************************
// Copyright (C) 2018 Blazors
// Please contact me if you have any questions
// File Name:             MainSingle
// Author:                romantic123fly
// WeChat||QQ:            at853394528 || 853394528 
// **********************************************************************
#endregion
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
注意事项:
getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。
*/
namespace SingleMode
{
    public class MainSingle : MonoBehaviour
    {
 
        // Use this for initialization
        void Start()
        {
            SingletonOne.GetInstance().Print();
            SingletonTwo.GetInstance().Print();
        }
    }
}

ステップ3

業績


オリジナルます。https://blog.csdn.net/qq_37310110/article/details/79563487 

出典Resourcesリンクします。https://download.csdn.net/download/qq_37310110/10287490

注:フォワード自己存在と

おすすめ

転載: blog.csdn.net/sx513240563/article/details/91490160