0
点赞
收藏
分享

微信扫一扫

简谈单例设计模式和抽象工厂模式

单例设计模式 和 抽象工厂模式

单例模式

  • 双重检查锁定

    public class Singleton5
    {
    private static Singleton5 _instance;
    private static readonly object SyncObject = new object();
    
    private Singleton5() { }
    
    public static Singleton5 Instance()
    {
        if (_instance==null)
        {
            lock (SyncObject)
            {
                if (_instance == null)
                {
                    _instance = new Singleton5();
                }
            }
        }
        return _instance;
    }
    }

    适用:单/多线程
    模式:双重检查锁定(Double-Check Locking)(线程安全)[推荐]
    优点:线程安全;延迟加载;效率较高(只会实例化一次,首先会判断是否实例化过,如果实例化了,直接返回实例,不需要进入lock;如果未实例化,进入lock,就算是多个调用也无妨,第一次调用的会实例化,第二个进入lock时会再次判断是否实例化,这样线程就不会阻塞了。)
    缺点:基本没有

  • 静态内部类

    public class Singleton6
    {
    private Singleton6() { }
    
    private static class SingletonInstance
    {
        public static Singleton6 Instance = new Singleton6();
    }
    
    public static Singleton6 Instance()
    {
        return SingletonInstance.Instance;
    }
    }

    适用:单/多线程
    模式:静态内部类(线程安全)[推荐]
    优点:避免了线程不安全;延迟加载;效率高(这种方式跟饿汉式方式采用的机制类似:都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方是:饿汉式只要Singleton类被装载就会实例化,没有Lazy-Loading的作用;而静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用Instance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。)
    缺点:基本没有

工厂模式

.NET简谈设计模式之(抽象工厂模式)

简单工厂

  • 简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法)
  • 现实生活中,工厂是负责生产产品的;同样在设计模式中,简单工厂模式我们可以理解为负责生产对象的一个类,称为“工厂类”。

在这里插入图片描述

Product 抽象类,定义各个具体产品的公共接口
ProductA 产品类,继承抽象产品类,实现抽象方法
ProductB,ProductC同A
ProductFatory 定义静态方法,根据所需产品不同返回对应产品。

抽象工厂

抽象工厂:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象

byte[] 数组和其他类型转换

        private T BytesToT<T>(byte[] bytes)
        {
            using (var ms = new MemoryStream())
            {
                ms.Write(bytes, 0, bytes.Length);
                var bf = new BinaryFormatter();
                ms.Position = 0;
                var x = bf.Deserialize(ms);
                return (T)x;
            }
        }

        private byte[] TToBytes<T>(T obj)
        {
            var bf = new BinaryFormatter();
            using (var ms = new MemoryStream())
            {
                bf.Serialize(ms, obj);
                var r = ms.ToArray();
                if (BitConverter.IsLittleEndian)
                    Array.Reverse(r);
                return r;
            }
        }
举报

相关推荐

0 条评论