ホームページ  >  記事  >  バックエンド開発  >  Python のシングルトン パターンの紹介

Python のシングルトン パターンの紹介

PHPz
PHPzオリジナル
2017-04-02 13:26:481198ブラウズ

バスは、コンピューターのさまざまな機能コンポーネントまたはデバイス間でデータ、制御信号、その他の情報を送信するための公共通信ソリューションの 1 つです。次のシナリオを想定します。中央処理装置 (CPU) は特定のプロトコル バスを介してセマフォに接続されており、セマフォには 64 色を設定でき、そのすべてがセマフォを制御できます。 , この信号灯の色は独立して設定できます。プロトコルの詳細 (印刷によって表現) と、シグナルなどのスレッドの制御ロジックを実装する方法を抽象化します。
制御のためにスレッド ロックを追加することが最初に思い浮かぶ方法であることは間違いありませんが、各スレッドによるロックの制御により、間違いなくモジュール間の結合が強化されます。次に、デザインパターンシングルケースパターンを使用して、この問題を解決します。
シングルトンパターンとは何ですか?シングルトン パターンとは、クラスのインスタンスが 1 つだけであることを保証し、そのインスタンスにアクセスするためのグローバル アクセス ポイントを提供することを意味します。具体的には、この例では、バス オブジェクト はシングルトンであり、インスタンスが 1 つだけあり、各スレッドにはバスへのグローバル アクセス ポイントが 1 つだけ、つまり唯一のインスタンスがあります。
Pythonコードは次のとおりです:

#encoding=utf8import threading
import time#这里使用方法new来实现单例模式class Singleton(object):#抽象单例
    def new(cls, *args, **kw):        if not hasattr(cls, '_instance'):
            orig = super(Singleton, cls)
            cls._instance = orig.new(cls, *args, **kw)        return cls._instance#总线class Bus(Singleton):
    lock = threading.RLock()    def sendData(self,data):        self.lock.acquire()
        time.sleep(3)
        print "Sending Signal Data...",data        self.lock.release()#线程对象,为更加说明单例的含义,这里将Bus对象实例化写在了run里class VisitEntity(threading.Thread):
    my_bus=""
    name=""
    def getName(self):        return self.name    def setName(self, name):        self.name=name    def run(self):        self.my_bus=Bus()        self.my_bus.sendData(self.name)if  name=="main":    for i in range(3):
        print "Entity %d begin to run..."%i
        my_entity=VisitEntity()
        my_entity.setName("Entity_"+str(i))
        my_entity.start()

実行結果は次のとおりです:
エンティティ0が実行開始...
エンティティ1が実行開始...
エンティティ2が実行開始...
シグナルを送信データ... Entity_0
信号送信データ... Entity_1
信号送信データ... Entity_2
プログラムの実行中、3 つのスレッドが同時に実行されます (実行結果の最初の 3 行はすぐに出力されます) 、そしてそれぞれバス リソースを占有します (最後の 3 行はそれぞれ 3 秒ごとに 1 行を出力します)。バスが 3 回インスタンス化されているように見えますが、実際にはメモリ内にインスタンスは 1 つだけです。

シングルケース パターン

シングルケース パターンは、すべてのデザイン パターンの中で比較的単純なタイプであり、その定義は次のとおりです。クラスにはインスタンスが 1 つだけあることを確認し、そのインスタンスへのグローバル アクセス ポイントを提供します。グローバルにアクセス ポイントは 1 つだけです)

シングルトン モードの利点と用途

シングルトン モードの利点:
1. シングルトン モードは世界で 1 つのインスタンスのみを必要とするため、多くのメモリ領域を節約できます。グローバルに 1 つのアクセス ポイントのみであるため、データ同期をより適切に制御し、複数の占有を回避できます。
3. 単一のインスタンスをメモリ内に保持して、システムのオーバーヘッドを削減できます。
シングルトン モードの適用例: 1. グローバルに一意のシリアル番号を生成する
2. ディスク、バスなどのグローバルに再利用される一意のリソースにアクセスする
3. 単一のオブジェクトが占有するリソースが多すぎる。など;
4. Windows のタスクマネージャーなど、システムのグローバルな統合管理。

シングルトン モードの欠点

1. シングルトン モードの拡張は比較的困難です。

2. 単一責任の原則にある程度違反します。 ) );

3. シングルトン モードは、同時コラボレーション ソフトウェア モジュールで最初に完了するため、テストには適しません。

以上がPython のシングルトン パターンの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。