建造者模式(builder)

/***
 * 建造者模式(Builder)
 *          将一个复杂的对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
 *          使用建造者模式,客户端只需要指定建造的类型就可以得到他们,而建造的过程和细节
 *          就不需要知道了。
 *          注:
 *          个人理解,Builder模式就是在类和对象之间,再创建一个中间类(即Director),这个中间类负责控制每个对象具体执行的方法。
 *          而在客户端只需要指定让谁去创建(Doing),就可以了,至于创建的方法它完全不需要知道。
 */ 


using UnityEngine;
using System.Collections;
using System;

public class BuilderModel : MonoBehaviour {

    private Dog dog;
    private Director director;
    // Use this for initialization
    void Start () {
        //cat = new Cat("Mao");
        dog = new Dog("WangCai");           ///*  *//
        director = new Director(dog);            ///* 客户端只需要在这里告诉指挥者,需要创建一个什么类型的对象 *//
    }
    
    // Update is called once per frame
    void Update () {
    
    }

    void OnGUI() 
    {
        if(GUI.Button(new Rect(0,0,100,50),""))
        {
            director.Doing();            ///* 创建的过程和细节都是由Director类来完成,客户端无需了解 *//
        }
    }
}
/* 抽象的Builder类 */
abstract class Animal 
{
    protected string name;


    public Animal(string name)
    {
        this.name = name;
    }

    public abstract void Run();
    public abstract void Call();
    public abstract void Eat();
}
/* ConcreteBuilder:具体建造者,实现Builder的各个接口,构造和装备各个部件 */
class Dog : Animal      
{
    public Dog(string name) : base(name) 
    {
        
    }

    public override void Run()
    {
        //throw new NotImplementedException();
        Debug.Log("I can run fast,beacase I am "+ this.name);
    }

    public override void Call()
    {
        //throw new NotImplementedException();
        UnityEngine.Debug.Log("Wang wang!!!");
    }
    public override void Eat()
    {
        //throw new NotImplementedException();
        Debug.Log("I like eat beaf!!");
    }
}
/* 
 * Director类,在Builder模式中,负责控制行为流程,也负责隔离客户端和建造过程的关联
 * 注:这里如果使用泛型的话,还可以最大化节省代码,增加灵活性。
 * 例:private T t;
 * */
class Director 
{
    private Dog dog;            

    public Director(Dog dog)
    {
        this.dog = dog;
    }

    public void Doing() 
    {
        dog.Call();
        dog.Eat();
        dog.Run();
    }

}
/*          何时使用?
 *          建造者模式主要用于创建一些复杂的对象,这些对象的内部构建间的建造顺序通常是稳定的,
 *          但对象内部的构建通常面临着复杂的变化。
 *          由于组装过程是隐藏的,所以要改变一个产品的内部表示,再创建一个具体构造着就可以了。

 

posted @ 2013-10-11 10:06  Vital  阅读(255)  评论(0编辑  收藏  举报