美文网首页
单例模式(下)和工厂模式

单例模式(下)和工厂模式

作者: 土豆_9724 | 来源:发表于2017-08-25 10:35 被阅读0次

    单例模式(下)

    大家好,我是北京菜鸟在线的unity3d 范老师,今天又到了和大家分享知识的时间了。我们这次接着上次的来讲:

    2 :以下是单例模式的另一个小例子:

    2-1 :创建一个新的场景,创建一个新的人类,我们都有名字,我们有共同的地球。并给1,2,3,三个人脚本上的mName赋值上字符串名字。具体如下图

    2-2 人类脚本详细如下:

    using UnityEngine;

    using System.Collections;

    //创建一个人类脚本

    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;

    //创建一个地球脚本

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

    2-4 挂在像机上的脚本

    using UnityEngine;

    using System.Collections;

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

    public class test01 : MonoBehaviour {

    //把Hierarchy下的,游戏对象叫1的,那个拖拽到这里就好。
    public Human mHuman;
                 // Use this for initialization
                 void Start () {   // 打印这个游戏对象叫1的名字
     // 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,我们把所有的静态的变量都定义到一个不继承MoboBehavious的类里,把如下代码:(在这里,下面的那些代码,不用挂在物体上)

    using UnityEngine;

    using System.Collections;

    //定义一个类,里面写上静态的变量

    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 ,我们在另一个脚本里,可以随意的调用,如下代码:

    using UnityEngine;

    using System.Collections;

    public class GameCOntrol : MonoBehaviour {

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

    }

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

    3-3:另一个种调用:

    using UnityEngine;

    using System.Collections;

    public class GameCOntrol : MonoBehaviour {

    void Awake()
    {
        if (GameDate .mModern == 0)
        {
            print( "测试模式" );
        }
        else if (GameDate.mModern == 1){
            print( "开发模式" );
        }
    
    }
    

    }

    今天我们就来看看在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 : 创建一个新的场景,并在工厂里创建三个Cube,做为三个工厂的载体,并为三个Cube挂上三个不的脚本。再创建一个boss,并添加脚本,从这个boss

    类中调用工厂的三个脚本里的方法。为了更的好的调用,我们使用新创建一个工厂类,并使三个工厂的脚本都继承这个工厂类。


    2-2 :运行脚本,可以看到上述的情况,控制台中输出的都是父类里的方法。这四个脚本的代码如下:

    2-2-1: 父类的脚本。

    using UnityEngine;

    using System.Collections;

    //三个工厂的父类,基类

    public class Factory : MonoBehaviour {

    //父类有一个虚方法
    public virtual void Create()
    {
        print( "我开始生产了........" );
    }               
    

    }

    2-2-2 :三个工厂的脚本代码如下:

    using UnityEngine;

    using System.Collections;

    // 一个可口可乐生产子类脚本

    public class CoCoFactory : Factory {

    public void Create()
    {
        print( "生产一罐可口可乐!!" );
    }
    

    }

    2-2-3 : 三个工厂的脚本代码如下:

    using UnityEngine;

    using System.Collections;

    //一个生产芬达的工厂代码如下:

    public class FendaFactory : Factory {

    public void Create()
    {
        print( "生产一罐芬哒!!" );
    }
    

    }

    2-2-4 : 三个工厂的脚本代码如下:

    using UnityEngine;

    using System.Collections;

    // 一个生产可乐的工厂脚本

    public class ColaFactory : Factory
    {
    public void Create()
    {
    print( "生产一罐可乐!!" );
    }
    }

    2-2-5 :总boss类,调用这三个工厂里的Create( ) 的方法:

    using UnityEngine;

    using System.Collections;

    //在boss总管理的类里调用三个工厂里的方法。

    public class FactoryManager : MonoBehaviour {

     //下面写三种,然后,把三个工厂模式拉进去就好,但是有些麻烦
    

    // public ColaFactory mColaFactory;

    // public CoCoFactory mCoCoFactory;

    // public FendaFactory mFendaFactory;

    //所以,声名一个父类,把三个工厂,都继承这个父类。我们用数组来实现,如下
    
    public Factory [] mFactory;
    
    void Start()
    {
        AllCreate();
    }
    void AllCreate()
    {
        for (int i = 0; i < mFactory.Length; i++)
        {   //遍历后调用每个工厂里的方法
            mFactory[i].Create();
        }
    }
    

    }

    3:通过运行程序,我们发现,运行的,只是第一个脚本,父类的脚本里的Create( )方法。这里需要我们在C#学到的 继承里的虚方法 ,子类里override 重写。

    3-1 :至于总boss的脚本,依然保持不变。这就是工厂模式,是设计模式中比较简单的一种。

    相关文章

      网友评论

          本文标题:单例模式(下)和工厂模式

          本文链接:https://www.haomeiwen.com/subject/oycudxtx.html