单例模式

举个例子,在某些情况下,有些对象,我们只需要一个就可以了,这就是我们Unity3d中的单例模式。

  比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,

  这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,

  即在整个的打印过程中我只有一个打印程序的实例。

  简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,

  任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。

  下面来看单例模式的结构图(图太简单了)

Unity3d培训中单例模式的简介

  从上面的类图中可以看出,在单例类中有一个构造函数 Singleton ,

  但是这个构造函数却是私有的(前面是“ - ”符号),

  然后在里面还公开了一个 GetInstance()方法,

  通过上面的类图不难看出单例模式的特点,从而也可以给出单例模式的定义

  单例模式保证一个类仅有一个实例,同时这个类还必须提供一个访问该类的全局访问点。

  先来将Unity3d培训中的Singleton写出来再说

  Singleton 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

namespace  Singleton
{
public  class  Singleton
{
//定义一个私有的静态全局变量来保存该类的唯一实例
private  static  Singleton singleton;
///
/// 构造函数必须是私有的
/// 这样在外部便无法使用 new 来创建该类的实例
///
private  Singleton()
{
}
///
/// 定义一个全局访问点
/// 设置为静态方法
/// 则在类的外部便无需实例化就可以调用该方法
public  static  Singleton GetInstance()
{
//这里可以保证只实例化一次
//即在第一次调用时实例化
//以后调用便不会再实例化
if  (singleton == null)
{
singleton =  new  Singleton();
}
return  singleton;
}
}
}
客户端代码
using  System;
namespace  SingletonTest
{
class  Program
{
static  void  Main(string[] args)
Singleton.Singleton singletonOne =  Singleton.Singleton.GetInstance();
  Singleton.Singleton singletonTwo =  Singleton.Singleton.GetInstance();
   if  (singletonOne.Equals(singletonTwo))
   Console.WriteLine( "singletonOne 和 singletonTwo 代表的是同一个实例" );
   else
    Console.WriteLine( "singletonOne 和 singletonTwo 代表的是不同一个实例" );
 Console.ReadKey();
}}}

  那么在Unity引擎里面,使用单例模式好处体现在哪里呢?

  其实最容易想到的就是我们的主角,场景可以有很多个,但是player主角只有一个。

  切场景的时候,如果想保留主角信息,可以使用DontDestroyOnLoad阻止物体被销毁。

  但是这样的话每次切回原来的场景,就会发现主角的数量多一个。具体看下列的事例:

  打开项目先打开build setting

Unity3d培训中单例模式的简介

  把1设置为场景0,把2设置成场景1,直接运行游戏

  我们可以看到,若干秒之后,scene中的capsule变得越来越多。

Unity3d培训中单例模式的简介

  假设这个capsule是玩家的话,每次切场景都会多生成1个。

  我们打开名字叫scene的脚本,在注释27,28,29行,开启24,25,26行,

  开始游戏,运行单例模式,切场景player数量不会增加

Unity3d培训中单例模式的简介

  因为我们声明了一个静态变量,他从程序开始到最后游戏结束只有一个实例,

  而24行我判断他是否为空,如果为空我才创建一个新的player,并把player赋给静态变量。

  那么以后切回这个Unity3d中的场景,再次调用start的时候,因为静态变量已经不为空了,所以不会再生成新的实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值