單例模式(下)和工廠模式

單例模式(下)

大家好,我是北京菜鳥在線的unity3d 范老師,今天又到了和大家分享知識的時間了。我們這次接著上次的來講:

2 :以下是單例模式的另一個小例子:

2-1 :創(chuàng)建一個新的場景,創(chuàng)建一個新的人類,我們都有名字,我們有共同的地球。并給1,2,3,三個人腳本上的mName賦值上字符串名字。具體如下圖

2-2 人類腳本詳細如下:

using UnityEngine;

using System.Collections;

//創(chuàng)建一個人類腳本

public class Human : MonoBehaviour {

public string mName0;
// 共享的地球,有且只有一個實例
public static Earth mEarth;
             // Use this for initialization
             void Awake () {
               mEarth =  GameObject.Find("Earth" ).GetComponent<Earth>();
            }

             // Update is called once per frame
             void Update () {

            }

}

2-3 地球腳本

using UnityEngine;

using System.Collections;

//創(chuàng)建一個地球腳本

public class Earth : MonoBehaviour {
public string mName = "地球";
}

2-4 掛在像機上的腳本

using UnityEngine;

using System.Collections;

// 如果我想知道,1的人物叫什么名字

public class test01 : MonoBehaviour {

//把Hierarchy下的,游戲?qū)ο蠼?的,那個拖拽到這里就好。
public Human mHuman;
             // Use this for initialization
             void Start () {   // 打印這個游戲?qū)ο蠼?的名字
 // print(mHuman.name);    //liuYiFei
    print(mHuman.mName0);  // liuyifei
   // print(Human.mEarth.mName);  //地球
   // print(Human.mEarth.name);   //Earth
            }

             // Update is called once per frame
             void Update () {

            }

}

3:不繼承MonoBehavious類

3-1,我們把所有的靜態(tài)的變量都定義到一個不繼承MoboBehavious的類里,把如下代碼:(在這里,下面的那些代碼,不用掛在物體上)

using UnityEngine;

using System.Collections;

//定義一個類,里面寫上靜態(tài)的變量

public class GameDate
{
public static bool mIsFullScreen = false; //是否全屏

public static int mWight = 1280; //屏幕的寬

public static int mHeight =720 ;  //屏幕的高
public static int mModern = 0;   // 測試模式                      

}

3-2 ,我們在另一個腳本里,可以隨意的調(diào)用,如下代碼:

using UnityEngine;

using System.Collections;

public class GameCOntrol : MonoBehaviour {

void Awake()
{   // 屏幕分辨率設(shè)置
    Screen.SetResolution(GameDate .mWight, GameDate.mWight, GameDate.mIsFullScreen);
}

}

public GameObject obj0;
void Start()
{
if( !obj0 )
{
print("xxxxxxx")
}
}

3-3:另一個種調(diào)用:

using UnityEngine;

using System.Collections;

public class GameCOntrol : MonoBehaviour {

void Awake()
{
    if (GameDate .mModern == 0)
    {
        print( "測試模式" );
    }
    else if (GameDate.mModern == 1){
        print( "開發(fā)模式" );
    }

}

}

今天我們就來看看在unity中如何使用單例模式,在unity中,我們分兩種單例,一種是繼承monobehavior的單例,一種是普通單例。

1.MonoBehavior單例

其實在unity中,如果腳本是繼承monobehavior,那么使用起單例來更加簡單。

只需要在Awake()里面,添加一句instance = this;

using UnityEngine;

using System.Collections;

public class test2 : MonoBehaviour {

public static test2 instance;
// Use this for initialization
void Awake () {
    instance = this;
}

// Update is called once per frame
void Update () {

}

}

2.普通類的單例

using UnityEngine;

using System.Collections;

public class test2 {

private static test2 instance;
public static test2 Instance
{
    get
    {
        if (null == instance)
            instance = new test2();
        return instance;
    }
    set { }
}

}

二:工廠模式

2-1 : 創(chuàng)建一個新的場景,并在工廠里創(chuàng)建三個Cube,做為三個工廠的載體,并為三個Cube掛上三個不的腳本。再創(chuàng)建一個boss,并添加腳本,從這個boss

類中調(diào)用工廠的三個腳本里的方法。為了更的好的調(diào)用,我們使用新創(chuàng)建一個工廠類,并使三個工廠的腳本都繼承這個工廠類。


2-2 :運行腳本,可以看到上述的情況,控制臺中輸出的都是父類里的方法。這四個腳本的代碼如下:

2-2-1: 父類的腳本。

using UnityEngine;

using System.Collections;

//三個工廠的父類,基類

public class Factory : MonoBehaviour {

//父類有一個虛方法
public virtual void Create()
{
    print( "我開始生產(chǎn)了........" );
}               

}

2-2-2 :三個工廠的腳本代碼如下:

using UnityEngine;

using System.Collections;

// 一個可口可樂生產(chǎn)子類腳本

public class CoCoFactory : Factory {

public void Create()
{
    print( "生產(chǎn)一罐可口可樂!!" );
}

}

2-2-3 : 三個工廠的腳本代碼如下:

using UnityEngine;

using System.Collections;

//一個生產(chǎn)芬達的工廠代碼如下:

public class FendaFactory : Factory {

public void Create()
{
    print( "生產(chǎn)一罐芬噠?。? );
}

}

2-2-4 : 三個工廠的腳本代碼如下:

using UnityEngine;

using System.Collections;

// 一個生產(chǎn)可樂的工廠腳本

public class ColaFactory : Factory
{
public void Create()
{
print( "生產(chǎn)一罐可樂??!" );
}
}

2-2-5 :總boss類,調(diào)用這三個工廠里的Create( ) 的方法:

using UnityEngine;

using System.Collections;

//在boss總管理的類里調(diào)用三個工廠里的方法。

public class FactoryManager : MonoBehaviour {

 //下面寫三種,然后,把三個工廠模式拉進去就好,但是有些麻煩

// public ColaFactory mColaFactory;

// public CoCoFactory mCoCoFactory;

// public FendaFactory mFendaFactory;

//所以,聲名一個父類,把三個工廠,都繼承這個父類。我們用數(shù)組來實現(xiàn),如下

public Factory [] mFactory;

void Start()
{
    AllCreate();
}
void AllCreate()
{
    for (int i = 0; i < mFactory.Length; i++)
    {   //遍歷后調(diào)用每個工廠里的方法
        mFactory[i].Create();
    }
}

}

3:通過運行程序,我們發(fā)現(xiàn),運行的,只是第一個腳本,父類的腳本里的Create( )方法。這里需要我們在C#學(xué)到的 繼承里的虛方法 ,子類里override 重寫。

3-1 :至于總boss的腳本,依然保持不變。這就是工廠模式,是設(shè)計模式中比較簡單的一種。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容