广

ASP.NET

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    .NET c# 单体模式(Singleton)

    2018-05-07 10:24:14 次阅读 稿源:互联网
    广告
    单体模式(Singleton)是经常为了保证应用程序操作某一全局对象,让其保持一致而产生的对象,例如对文件的读写操作的锁定,数据库操作的时候的事务回滚,还有任务管理器操作,都是一单体模式读取的。
      创建一个单体模式类,必须符合三个条件:
      1:私有构造函数(防止其他对象创建实例);
      2:一个单体类型的私有变量;
      3:静态全局获取接口

      下面我写一个类,为了看是不是单体,就加了一个计数器,如果是同一个类,那么这个类的计数每次调用以后就应该自动加一,而不是重新建对象归零:

      .NET c# 单体模式 

    using System;
    using System.Threading;
    public class Singleton{ 
        private int ObjCount=0;
        private Singleton(){
            Console.WriteLine("创建对象");
        }
        private static Singleton objInstance = null;
        public static  Singleton getInstance() {
            if (objInstance==null) objInstance=new Singleton();

            return objInstance;
        }
        public void ShowCount(){
            ObjCount++;
            Console.WriteLine("单个对象被调用了{0}次",ObjCount);
        }
    };


     然后我们来测试一下:
    public class ConsoleTest{
        public static void Main(string[] args){
            Console.WriteLine("开始执行单体模式"); 
            for(int i=0;i<5;i++){
                Singleton.getInstance().ShowCount();
            }

            Console.ReadLine();
        }
    };


    我在这个Main里面执行了5次,看看输出的结果:
    开始执行单体模式
    创建对象
    单个对象被调用了1次
    单个对象被调用了2次
    单个对象被调用了3次
    单个对象被调用了4次
    单个对象被调用了5次
      在这里可以看出,每次都是使用的同一个对象,实现了单体。
      为了测试在多线程下面是否是单体,下面我写了一个多线程测试的:
    class ApartmentTest
    {
        public static void RunMoreThread()
        {
            Thread newThread =  new Thread(new ThreadStart(ThreadSingleMethod));
            newThread.SetApartmentState(ApartmentState.MTA);
            Console.WriteLine("ThreadState: {0}, ApartmentState: {1},ManagedThreadId:{2}", newThread.ThreadState, newThread.GetApartmentState(),newThread.ManagedThreadId );
            newThread.Start();
        }

       public static void ThreadSingleMethod() {
            Singleton.getInstance().ShowCount();
        }
    };


    然后每次for循环执行ApartmentTest.RunMoreThread();
    再看看输出的结果:开始执行单体模式
    ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:3
    创建对象
    单个对象被调用了1次
    ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:4
    单个对象被调用了2次
    ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:5
    单个对象被调用了3次
    ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:6
    单个对象被调用了4次
    ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:7
    单个对象被调用了5次

    根据ManagedThreadId,可以看出不同的线路访问达到了单体,OK!

    c#的单体模式介绍完毕;

    下面是PHP 单体模式的代码:
    <?php

    header("Content-Type: text/html; charset=utf-8");

    class Singleton{ 
        private $ObjCount=0;
        private function __construct(){
            echo("创建对象<hr/>");
        }

        public static  function   getInstance() {
            static $objInstance = null;        
                      if ( $objInstance == null )
              $objInstance =  new Singleton();
            return $objInstance;

        }
        public function ShowCount(){
            $this->ObjCount++;
            echo("单个对象被调用了".$this->ObjCount.'次数<hr/>');
        }


    };


    for($i=0;$i<5;$i++)
        Singleton::getInstance()->ShowCount();
    ?>

    请注意以上PHP代码的私有静态变量范围,不要放在类主体。
    执行结果:
    创建对象
    --------------------------------------------------------------------------------
    单个对象被调用了1次数
    --------------------------------------------------------------------------------
    单个对象被调用了2次数
    --------------------------------------------------------------------------------
    单个对象被调用了3次数
    --------------------------------------------------------------------------------
    单个对象被调用了4次数
    --------------------------------------------------------------------------------
    单个对象被调用了5次数

    下面我们再来看看Java版本的写法:

    单体模式 Java
    class Singleton{ 
        private int ObjCount=0;
        private Singleton(){
            System.out.println("创建对象");
        }
        private static Singleton objInstance = null;
        public static  Singleton getInstance() {
            if (objInstance==null) objInstance=new Singleton();

            return objInstance;
        }
        public void ShowCount(){
            ObjCount++;
            System.out.println("单个对象被调用了"+ ObjCount +"次");
        }
    };
    class ConsoleTestSingleton{
        public static void main(String args[]){
            System.out.println("开始执行单体模式"); 
            for(int i=0;i<5;i++){
                Singleton.getInstance().ShowCount();
            }
        }
    };
    基本代码与c#一致,执行结果:
    开始执行单体模式
    创建对象
    单个对象被调用了1次
    单个对象被调用了2次
    单个对象被调用了3次
    单个对象被调用了4次
    单个对象被调用了5次

    可以看出,也是完全的单体,只要记住开头提到的三点,即可掌握该模式。
    ----------
    1:今天L出差
    2:昨天聚会,比较Happy
    3:SL和Z都是手机Q网
    4:无事之冬

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告