最近在园子的首页经常会看到一些有关设计模式的文章。23种设计模式要完全掌握可不一件容易的事.最早了解的种设计模式是Singleton模式(单件模式),主要是因为它简单。套用别人的代码大概是这样子:

Singleton模式与对象池的假设....public class Singleton
 1Singleton模式与对象池的假设.... class Program
 2    }

从宏观上看,一个对象被一个客户占有,至少在执行一个原子函数时,应该是不能被别外一个客户使用的,而当这个原子函数的执行时间很长(网络超时)。那其它的客户不都要停止工作了?但从微观上,单CPU的计算机同时一时刻只能有一个作业在执进,而这时Singleton的对象又是怎么样被执行的?如果说它能随意地让每个客户共享的话,那在我们的项目中就不需要每次执行都去实例化对象,对相同的类在一个AppDomain只存在一个实例,这样就可以减少在实例化对象上的性能损耗和.NET 拖管堆的压力。而这种方案是否可行??执行上面的测试,结果是可行的,我创建了100线程,每个线程都执行了WL()方法,在方法里面让线程等待3秒,而在当这个线程等待时,另外一个线程还是可以工作的。
    有一种场景,在Provider模式中(.NET 2.0和CS经常用到的一种模式)的。在使用这些的Provider的时候,不可避免的都会遇到对象的实例化问题,用反射的方法进行实例化(Activator.CreateInstance(string p_strType),也分不清这种方法算不算反向技术?),如果每次使用都去实例化,从理论上都会对性能造成一定的影响。而今天在考虑这个问题的时候首先想到的就是用Singleton模式,还有一种方法叫对象池?记得在看《.NET框架程序设计》的时候提到了对象的生命周期和对象池方法。
    忘了怎么样在书里面是怎么样去实现对象池了。不过目前有一个想法就是用IDisposable这个接口来做文章。所有的对象都继承这个类,然后实现Dispose方法,这个方法不去Dispose对象,只是将对象的Used标志记成false,然后放回池里面:
Singleton模式与对象池的假设....public interface IPoolDispose : IDisposable
    }

对象定义如下:
Singleton模式与对象池的假设.... public class ObjectPool : IPoolDispose
    {
        private int m_intUsed = 0;
        public void WL()
        {
            m_intUsed++;
            Console.WriteLine(this.GetHashCode() + "我被使用了: " + m_intUsed.ToString() + "次");
            Thread.Sleep(30);            //对象等待时间
        }
        private bool m_bUsed = false;
        public bool Used
        {
            get { return m_bUsed; }
            set { m_bUsed = value; }
        }
        public void Dispose()
        {
            Used = false;
        }
    }
public class ClassFactory
    {
        static ArrayList array = new ArrayList();
        public static ObjectPool CreateObject()
        {
            foreach (IPoolDispose pool in array)
            {
                if (pool.Used == false)
                {
                    pool.Used = true;
                    return (ObjectPool)pool;
                }
            }
            ObjectPool m_object = new ObjectPool();
            if (array.Count < 10)
                array.Add(m_object);
            return m_object;
        }
    }
Singleton模式与对象池的假设.... class Program
下载

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-28
  • 2021-09-11
  • 2022-12-23
  • 2022-01-22
  • 2022-12-23
猜你喜欢
  • 2021-09-29
  • 2021-11-09
  • 2022-12-23
  • 2021-11-09
  • 2022-12-23
  • 2021-06-06
相关资源
相似解决方案