创建型模式-EP2

ooowl
  • 系统设计
  • 软件工程
  • 设计模式
About 2 min

创建型模式-EP2

工厂方法模式

抽象工厂模式

生成器模式

原型模式

单例模式

单例设计模式open in new window
在unity中通常用在各种全局的 管理器 中,声音,唯一的角色管理器中,每次获得的都是这个东西,声音不会重复等。
保证一个类只有一个实例, 并提供一个访问该实例的全局节点,注意在多线程多进程环境下使用的时候会不会一个程序空间创建一个导致多次创建。

  • 将默认构造函数设为私有, 防止其他对象使用单例类的 new运算符。
  • 新建一个静态构建方法作为构造函数。 该函数会 “偷偷” 调用私有构造函数来创建对象, 并将其保存在一个静态成员变量中。 此后所有对于该函数的调用都将返回这一缓存对象。
  • 该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象,饿汉式在类加载的时候就创建无所谓,懒汉式可能在首次创建的时候创建多个。但是如果实例的创建过程非常耗时或耗资源,且长时间未使用,可能会造成资源的浪费
  • 建议不要在单例类中存储线程不安全的属性。这是因为单例对象是全局共享的,存储线程不安全的属性可能会引发并发问题 (虽然在.net中静态变量和构造函数的初始化也是懒汉式的触发,所以在调试器中并不能直接看到,而且调试器也不能直接看堆内容
Click to see more

namespace DesignPatterns;  
  
public class SingletonPrac  
{  
    private SingletonPrac()  
    {        Console.WriteLine("create a SingletonPrac instance");  
    }    // static SingletonPrac instance = null; // 实际上不在类里面,而在堆中  
    // 如果换成下面这行就是饿汉模式,类在堆初始化的时候就创建一次  
    static SingletonPrac instance = new SingletonPrac();  
    public static SingletonPrac GetInstance()  
    {        if (instance == null) //懒汉模式  
        {  
            instance = new SingletonPrac();  
        }        return instance;  
    }  
  
    public void Show()  
    {        Console.WriteLine($"SingletonPrac intance id: {this.GetHashCode()}"); // GetHashCode就是返回对象的哈希码,对象在内存中唯一的哈希码  
    }  
  
}

//-------Main中-----

class Program  
{  
    static void Main(string[] args)  
    {        
        Console.WriteLine("-----------------单例模式-----------------");  
        SingletonPrac s1 = SingletonPrac.GetInstance();  
        SingletonPrac s2 = SingletonPrac.GetInstance();  
        SingletonPrac s3 = SingletonPrac.GetInstance();  
        s1.Show();s2.Show();s3.Show();  
    }}

运行结果

-----------------单例模式-----------------
create a SingletonPrac instance
SingletonPrac intance id: 32854180
SingletonPrac intance id: 32854180
SingletonPrac intance id: 32854180

Loading...