当前位置: 七九推 > IT编程>软件设计>设计模式 > 浅谈单例

浅谈单例

2022年06月23日 设计模式 我要评论
单例模式1.个人思路1.业务需求统一使用同一个对象(创建的对象为一个 使用的对象是同一个)2.业务思考如何生成对象 保存对象如何保证生成的对象唯一3.实现的方案利用系统在需要用到对象前进行唯一 一次初

单例模式

1.个人思路

  • 1.业务需求

统一使用同一个对象(创建的对象为一个 使用的对象是同一个)

  • 2.业务思考
  1. 如何生成对象 保存对象
  2. 如何保证生成的对象唯一
  • 3.实现的方案
  1. 利用系统在需要用到对象前进行唯一 一次初始化
  2. 调用对象为空的时候 进行一次初始化 保存对象

2.保证生成的单例唯一

2.1 使用static让系统帮忙初始化

    `  public sealed class singleton
     {
             private static readonly singleton instance = new singleton();

             private singleton() { }

             public static singleton instance
             {
                get { return instance; }
             }

      }`

2.2 使用unity的生命周期

`      public sealed class singleton : monobehaviour {

              public static singleton instance { get; private set; }

              private void awake()
              {
                      instance = this;
              }

        }`

2.3 使用锁保证单例唯一

`     public sealed class singleton {

    private static singleton instance = null;
    private static readonly object syunclock = new object();

    private singleton() { }

    public static singleton instance
    {
        get
        {
            if (instance == null)
            {
                lock (syunclock)
                {
                    if (instance == null)
                    {
                        instance = new singleton();
                    }
                }
            }
            return instance;
        }
    }
}`

2.4 使用字典保证生成的单例唯一

    ` 
public sealed class singleton : isingleton
{

    private singleton() { }
}

public interface isingleton {

}

 public class singletonmanager
{
   private static readonly concurrentdictionary<string, isingleton> singletondict = new concurrentdictionary<string, isingleton>();

    public static t getsingleton<t>() where t : class, isingleton
    {
        string classname = typeof(t).tostring();

        if (!singletondict.containskey(classname))
        {
            constructorinfo[] constructorinfos = typeof(t).getconstructors (bindingflags.instance | bindingflags.nonpublic);
            constructorinfo constructorinfo = array.find(constructorinfos, c => c.getparameters().length == 0);
            if (constructorinfo == null)
            {
                throw new exception("生成失败! 没有找到私有的构造函数");
            }
            t manager = constructorinfo.invoke (null) as t;
            singletondict.tryadd(classname, manager);
        }
        return singletondict[classname] as t;
    }
}`

2.5 综合考虑

 `     public class singletonmanager {

private static gameobject singletonmanager;
private static readonly object syunclock = new object();
private static readonly dictionary<string, isingleton> singletondict = new dictionary<string, isingleton>();

public static t getsingleton<t>() where t : class, isingleton
{
    string classname = typeof(t).tostring();

    if (!singletondict.containskey(classname))
    {
        lock (syunclock)
        {
            if (!singletondict.containskey(classname))
            {
                t manager = null;
                if (typeof(t).issubclassof(typeof(monobehaviour)))
                {
                    addcomponentscript<t>(classname);
                }
                else
                {
                    addscript(classname, manager);
                }
            }
        }

    }
    return singletondict[classname] as t;
}

private static void addcomponentscript<t>(string classname)
{
    if(singletonmanager == null)
    {
        singletonmanager = new gameobject("singletonmanager");
        unityengine.object.dontdestroyonload(singletonmanager);
    }
    type type = typeof(t);
    singletonmanager.addcomponent(type);
    singletondict.add(classname, singletonmanager.getcomponent(type) as isingleton);
}

private static void addscript<t>(string classname, t manager) where t : class, isingleton
{
    constructorinfo[] constructorinfos = typeof(t).getconstructors(bindingflags.nonpublic | bindingflags.instance | bindingflags.declaredonly);
    constructorinfo constructorinfo = array.find(constructorinfos, c => c.getparameters().length == 0);
    if (constructorinfo == null)
    {
        throw new exception("生成失败! 没有找到私有的构造函数");
    }
    manager = constructorinfo.invoke(null) as t;
    singletondict.add(classname, manager);
}

}`

`public interface isingleton
{

}`

 

(0)
打赏 微信扫一扫 微信扫一扫

相关文章:

  • 23种设计模式概述

    23种设计模式概述

    设计模式共有23种,创建型模式5种,结构型模式7种,行为型模式11种,本章只做概念性说明。 ࿰... [阅读全文]
  • 设计模式 - 策略模式

    设计模式 - 策略模式

    前言:  先不管模式, 把他和他的名字都忘了, 来看看问题 和 设计思路. 为啥要这么做.场景:  有一家店铺, 里面有一个售货员, 售货员当然是要卖东西的啦,... [阅读全文]
  • 大话设计模式笔记(三)の六大原则

    大话设计模式笔记(三)の六大原则

    单一职责原则英文:single responsibility principle,简称srp。定义就一个类而言,应该仅有一个引起它变化的原因。描述如果一个类承担... [阅读全文]
  • 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到,进行查看。这次,让我们通过设计模式的思想,来好好认识下工厂方法模式。创建者和产品所有工厂模式都用来封装对象的创…

    2022年06月23日 软件设计
  • 创建型模式之工厂模式(2.2)

    创建型模式之工厂模式(2.2)

    什么是工厂模式?工厂模式是创建型模式的一种,工厂是用来生产的,而在java里,是用来生产对象实例的。和单例模式相似,工厂模式同样聚焦于在考虑整个软件构建的情况下... [阅读全文]
  • 设计模式--Proxy模式

    设计模式--Proxy模式

    这篇主要介绍代理模式相关内容,主要是一些基本概念普及。代理模式1、什么是代理模式?代理模式(proxy),为其他对象提供一种代理以控制对这个对象的访问。[dp]... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2022  七九推 保留所有权利. 粤ICP备17035492号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com