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

單例模式(下)

大家好,我是北京菜鳥(niǎo)在線的unity3d 范老師,今天又到了和大家分享知識(shí)的時(shí)間了。我們這次接著上次的來(lái)講:

2 :以下是單例模式的另一個(gè)小例子:

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

2-2 人類腳本詳細(xì)如下:

using UnityEngine;

using System.Collections;

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

public class Human : MonoBehaviour {

public string mName0;
// 共享的地球,有且只有一個(gè)實(shí)例
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)建一個(gè)地球腳本

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

2-4 掛在像機(jī)上的腳本

using UnityEngine;

using System.Collections;

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

public class test01 : MonoBehaviour {

//把Hierarchy下的,游戲?qū)ο蠼?的,那個(gè)拖拽到這里就好。
public Human mHuman;
             // Use this for initialization
             void Start () {   // 打印這個(gè)游戲?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)的變量都定義到一個(gè)不繼承MoboBehavious的類里,把如下代碼:(在這里,下面的那些代碼,不用掛在物體上)

using UnityEngine;

using System.Collections;

//定義一個(gè)類,里面寫(xiě)上靜態(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;   // 測(cè)試模式                      

}

3-2 ,我們?cè)诹硪粋€(gè)腳本里,可以隨意的調(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:另一個(gè)種調(diào)用:

using UnityEngine;

using System.Collections;

public class GameCOntrol : MonoBehaviour {

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

}

}

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

1.MonoBehavior單例

其實(shí)在unity中,如果腳本是繼承monobehavior,那么使用起單例來(lái)更加簡(jiǎn)單。

只需要在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)建一個(gè)新的場(chǎng)景,并在工廠里創(chuàng)建三個(gè)Cube,做為三個(gè)工廠的載體,并為三個(gè)Cube掛上三個(gè)不的腳本。再創(chuàng)建一個(gè)boss,并添加腳本,從這個(gè)boss

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


2-2 :運(yùn)行腳本,可以看到上述的情況,控制臺(tái)中輸出的都是父類里的方法。這四個(gè)腳本的代碼如下:

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

using UnityEngine;

using System.Collections;

//三個(gè)工廠的父類,基類

public class Factory : MonoBehaviour {

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

}

2-2-2 :三個(gè)工廠的腳本代碼如下:

using UnityEngine;

using System.Collections;

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

public class CoCoFactory : Factory {

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

}

2-2-3 : 三個(gè)工廠的腳本代碼如下:

using UnityEngine;

using System.Collections;

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

public class FendaFactory : Factory {

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

}

2-2-4 : 三個(gè)工廠的腳本代碼如下:

using UnityEngine;

using System.Collections;

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

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

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

using UnityEngine;

using System.Collections;

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

public class FactoryManager : MonoBehaviour {

 //下面寫(xiě)三種,然后,把三個(gè)工廠模式拉進(jìn)去就好,但是有些麻煩

// public ColaFactory mColaFactory;

// public CoCoFactory mCoCoFactory;

// public FendaFactory mFendaFactory;

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

public Factory [] mFactory;

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

}

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容