设计模式<1>------单例模式和原型模式------创建型

 原文引自:http://www.cnblogs.com/lonelyxmas/p/3720808.html

单例模式

单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。//一般使用第三种实现方式

 一、常用模式:

public class Singleton
{
        private static Singleton instance;
  
        private Singleton()
        {
          
        }
  
        public static Singleton GetInstance()
        {
                if(instance==null)
                {
                        instance=new Singleton();
                }
                return instance;
        }
}

这种模式只适用在单线程下,并没有考虑到线程并发的问题,在多线程中,可能出现两个线程同时获取Instance的实例,可能会出现多个实例对象。

二、多线程下Lazy模式:

public class Singleton 
{ 
       private static Singleton instance; 
       private static object _lock=new object(); 
  
       private Singleton() 
       { 
  
       } 
  
       public static Singleton GetInstance() 
       { 
               if(instance==null) 
               { 
                      lock(_lock) 
                      { 
                             if(instance==null) 
                             { 
                                     instance=new Singleton(); 
                             } 
                      } 
               } 
               return instance; 
       } 
}  

使用了Lock锁,可以较好的解决多线程下单例模式的实现,lock锁保证同一时间内只有一个线程能访问Lock里面的语句块,比较有效的解决性能的开销。

三、饿汉模式

public sealed class Singleton 
{ 
        private static readonly Singleton instance=new Singleton(); 
   
        private Singleton() 
        { 
        } 
  
        public static Singleton GetInstance() 
        { 
               return instance; 
        } 
}

该类标记为 sealed 以阻止发生派生,而派生可能会增加实例。使用的readonly关键可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。

 

原型模式:

原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype

原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代

abstract class Prototype
{
        private string id;
        public Prototype(string id)
        {
            this.id = id;
        }
        public string ID
        {
            get { return id; }
        }

        public abstract Prototype Clone();
}

class ConcretePrototype : Prototype
{
        public ConcretePrototype(string id):base(id)
        {}
        public override Prototype Clone()
        {
            //克隆当前对象,浅复制
            return (Prototype)this.MemberwiseClone();
        }
}
     
class Program
{
        static void Main(string[] args)
        {
 
            ConcretePrototype p1 = new ConcretePrototype("I");
            ConcretePrototype c1 = (ConcretePrototype)p1.Clone();//克隆ConcretePrototype的对象p1就能得到新的实例c1.  
            Console.WriteLine("Cloned:{0}", c1.ID);
 
            Console.Read();  
        }
}

转载于:https://www.cnblogs.com/Lennon0925/p/6718273.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值