架构师_设计模式_结构型_单例模式
1:实现单例模式的
1:构造函数私有化,提供公共静态方法给外面访问,定义一个静态变量保存实例 加上双重判断和锁 这个也叫懒汉单例模式 在单例类里面定义方法,方法是先执行
2:静态构造函数,由CLR控制,且只调用一次,也叫饿汉单例模式, 定义的静态方法必须先构造这个实例再执行
2:为什么使用单例
对象的重用,性能快速 ,十几万个对象 重复实例 性能损失大
例子 数据库连接池 一般有十个线程,用完就还回去,如果不用单例,那么十个用完了,别人就需要等待了,
单例模式解决不了多线程安全问题, 当十万个对象同时访问单例,会出现线程冲突 能丢失几十个左右的线程
3:单利模式也有缺点,当需要使用重复的对象的时候,会造成对象的污染, 每一次实例化的类都会覆盖前面的,因为他们使用的是共同的一个对象,所以此时就可以使用原型模式
优先使用饿汉单例模式,线程安全;
using System; namespace 单例模式 { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } //饿汉单例模式 public class HungryManSingeletionMode { //第一步 构造函数私有化 //第一步私有化构造函数 private HungryManSingeletionMode() { Console.WriteLine("饿汉构造函数"); } //第二步 定义私有静态类 初始化为null private static HungryManSingeletionMode _hungryManSingeletionMode=null; //第三步 创建静态构造函数:由CLR保证,在第一次使用到这个类型之前,自动被调用且只调用一次 //很多初始化都可以在这里完成 static HungryManSingeletionMode() { _hungryManSingeletionMode = new HungryManSingeletionMode(); } //第四步提供公共方法访问 public static HungryManSingeletionMode createSingeletion() { return _hungryManSingeletionMode; } } //懒汉单例模式 双判断加锁 public class LazyManSingeletionMode { //第一步私有化构造函数 private LazyManSingeletionMode() { Console.WriteLine("懒汉构造函数"); } //第二步 定义私有静态变量 private static LazyManSingeletionMode _LazyManSingeletionMode = null; //第三步提供公共方法访问 public static void getSingeLetionMode() { //第六步加双重判断 防止多线程 if(_LazyManSingeletionMode == null){ //第五步加锁防止多线程 lock (ModeLock) { //第四步 外卖要实例化的时候 保证方法只实例化类一次 if (_LazyManSingeletionMode == null) { _LazyManSingeletionMode = new LazyManSingeletionMode(); } } } } //第五步 定义静态只读变量加锁 防止多个人同时进来, private static readonly object ModeLock=new object(); } }
本文来自博客园,作者:12不懂3,转载请注明原文链接:https://www.cnblogs.com/LZXX/p/12909503.html