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

举报
Echo_Wish 发表于 2022/07/21 15:47:17 2022/07/21
【摘要】 单例设计模式 和 抽象工厂模式 单例模式双重检查锁定public class Singleton5{ private static Singleton5 _instance; private static readonly object SyncObject = new object(); private Singleton5() { } public static...

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

单例模式

  • 双重检查锁定
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;
            }
        }
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。