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