编程设计模式之单例模式
Posted redlkop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程设计模式之单例模式相关的知识,希望对你有一定的参考价值。
单例模式,unity中一种很常用的设计模式,从“单例”字面意思上理解为——一个类只有一个实例,即保证一个类只有一个实例的一种实现方法,官方给出的定义是定义:确保一个类只有一个实例,并提供一个全局访问点。
这里运用老师的思路自己弄的一张设计UGUI框架的图:
这里的运用就是单例模式,就像开汽车,我不必去做其它的事,只需要掌握驾驶室,就可以操作整个汽车。
启动器:
public class GameRoot : MonoBehaviour {
void Start () {
UIManager.Instance.PushPanel(UIPanelType.MainMenu); //实例化入口,这是单例模式的关键
}
}
UI管理器:
public class UIManager {
//单例核心:
//1.定义一个静态的对象 在外界访问 在内部构造
//2.构造方法私有化
private static UIManager _instance;
public static UIManager Instance
{
get
{
if(_instance == null)
{
_instance = new UIManager();
}
return _instance;
}
}
private Transform canvastransform;
private Transform CanvasTransform
{
get
{
if(canvastransform == null )
{
canvastransform = GameObject.Find("Canvas").transform;
}
return canvastransform;
}
}
private Dictionary<UIPanelType, string> panelPathDict; //存储面板prefab路径
private Dictionary<UIPanelType, BasePanel> panelDict; // 保存所有实例化的面板上的BasePanel组件
private Stack<BasePanel> panelStack;
private UIManager()
{
ParseUIPanelTypeJson();
}
public void PushPanel(UIPanelType panelType) // 显示界面
{
if(panelStack == null)
{
panelStack = new Stack<BasePanel>();
}
//判断是否有页面
if(panelStack.Count > 0)
{
BasePanel topPanel = panelStack.Peek();
topPanel.OnPause();
}
BasePanel panel = GetPanel(panelType);
panel.OnEnter();
panelStack.Push(panel);
}
public void PopPanel() //出栈,移除界面
{
if (panelStack == null)
{
panelStack = new Stack<BasePanel>();
}
if(panelStack.Count<=0)
{
return;
}
//关闭栈顶页面
BasePanel topPanel = panelStack.Pop();
topPanel.OnExit();
if(panelStack.Count<=0)
{
return;
}
BasePanel topPanel2 = panelStack.Peek();
topPanel2.OnResume();
}
public BasePanel GetPanel(UIPanelType panelType)
{
if(panelDict == null)
{
panelDict = new Dictionary<UIPanelType, BasePanel>();
}
//BasePanel panel;
//panelDict.TryGetValue(panelType, out panel); //TOOD
BasePanel panel = panelDict.TryGet(panelType);
if(panel == null)
{
//如果找不到,就将找到prefab的路径,然后去实例化面板
//string path;
//panelPathDict.TryGetValue(panelType, out path);
string path = panelPathDict.TryGet(panelType);
GameObject instPanel= GameObject.Instantiate(Resources.Load(path))as GameObject;
instPanel.transform.SetParent(CanvasTransform,false); //TOOD
panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());
return instPanel.GetComponent<BasePanel>();
}
else
{
return panel;
}
}
[Serializable]
class UIPanelTypeJson
{
public List<UIPanelInfo> infoList;
}
private void ParseUIPanelTypeJson()
{
panelPathDict = new Dictionary<UIPanelType, string>();
TextAsset ta = Resources.Load<TextAsset>("UIPanelType");
UIPanelTypeJson jsonObject= JsonUtility.FromJson<UIPanelTypeJson>(ta.text);
foreach(UIPanelInfo info in jsonObject.infoList)
{
//Debug.Log(info.panelType);
panelPathDict.Add(info.panelType, info.path);
}
}
//测试方法;
public void Test()
{
string path;
panelPathDict.TryGetValue(UIPanelType.Knapsack, out path);
Debug.Log(path);
}
}
后面部分:就是创建一个json格式或xml格式交互数据,然后创造一个library来管理所有的类型等数据,然后用这个用这个library来管理物体的实例方法,此代码运用了栈的特点,像”吃薯片“那样,控制面板实例化,其实作为一名学习者,很多东西其实看起不难,然而自己去敲敲,差别就大多了,所以,学习编程,买个好的机械键盘,天天劈里啪啦吧,哈哈。
注:此处是用的C#语言编写!
以上是关于编程设计模式之单例模式的主要内容,如果未能解决你的问题,请参考以下文章