第九节: 单例、静态类 (抱歉,周末休息了两天,所以停更了,今天周一上班啦,加油,又是元气满满的一天呢 3.1号,好的开端。最近写文章也是在整理以前学习的笔记,如有什么遗漏请大家多多指教,蟹蟹啦!!)
1.单例
学习单例,首先要学习 如何实现单例模式?
单例设计模式:
程序运行期间,确保一个类只有一个实例。
目的:降低对象的耦合度,保证一个类只有一个实例,并且这个实例易于访问
实现步骤:
1)构造方法设为private
2)内建静态实例
3)静态构造方法给实例做初始化
//单例模式
public class Singleton
{
private static Singleton instance;
//内建静态实例
private Singleton ()
{
}
//构造方法必须设为私有
public static Singleton Instance {
get {if (instance == null) {
instance = new Singleton (); //为实例初始化
}
return instance;
}
}
static Singleton ()
{
Debug.Log ("Static Singleton");
}
public void SaySingleton ()
{
Debug.Log ("Singleton");
}
}
2.静态类
静态类成员只能由类来调用。静态类不能实例化,所以内部只允许有静态成员或caonst修饰的常量。
一、用static修饰的类叫做静态类
特点:
1)仅包含静态成员和const修饰的常量
2)不能被实例化
3)是密封的(默认已经是sealed,不能再用sealed修饰)
4)有静态构造方法(函数),但静态构造方法必须是无参数的
总结:静态类是一种工具类,不能实例化,不能继承。静态构造方法用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。
在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
public sealed class Time //静态构造方法
{
public static float dealTime;
//用static修饰的类称为静态类。
static Time () //不能带访问修饰符,不能带参数,不能重载
{
dealTime = 0.4f; //如果不写这句话,系统会为静态变量赋一个默认值
Debug.Log ("static Time().");
}
}
接下来着重进一步了解一下静态类:
二、静态构造方法
1)静态构造方法用于初始化任何静态数据,或用于执行仅需执行一次的特定操作
2)在创建一个实例或者引用任何静态成员之前,将自动调用静态构造方法
3)静态构造方法不能带访问修饰符
三、静态类的使用场景
一些公有的变量或者方法可以放在静态类中,以方便其他类来使用。
例如:一些排序算法、或者游戏中背景音乐的管理,或者场景管理,可以把静态类看作一个工具类,任何地方只要需要都可以调用该类里面的成员,提高开发效率
缺点:项目中如果存在静态类较多时,会导致大量内存被占用无法释放,所以尽量少用。
加上一段以前写过的一个案例吧,直接上代码,haha:
using System;
namespace ke
{
//打印纸张的类型
public enum PaperType
{
A4,
A5
}
//打印机类,单例类
public class Printer
{
#region 单例
//1、私有的静态实例
private static Printer instance;
//2、私有构造方法
private Printer ()
{
}
//3、静态属性
public static Printer Instance {
get {
if (instance == null) {
instance = new Printer ();
}
return instance;
}
}
#endregion
//打印机的IP地址
private static string IP = "192.168.0.1";
//打印数量
private static int printCount;
//纸张类型
private static PaperType paper;
//用来判定是否连接打印机成功
static bool b = false;
//连接打印接的方法
public static void ConnectPrinter (
string _ip, PaperType _paper)
{
if (_ip == IP) {
//连接成功
b = true;
Debug.Log ("连接成功,你现在可以开始" +
"打印了,打印纸的类型为{0}", _paper);
} else {
b = false;
Debug.Log ("连接打印机失败,本台打印机" +
"的IP为{0},请重新设置!", IP);
}
}
//打印方法
public static void Print (int n)
{
if (b == true) {
printCount = n;
Debug.Log ("正在打印,打印的张数是:{0}",
printCount);
} else {
Debug.Log ("不能打印,因为没有连接成功");
}
}
}
}