Unity C# 设计模式(五)建造者模式

定义:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

组成部分:

1、Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2、ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
3、Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4、Product:所要创建的复杂对象。

 

示例代码:

/*
建造者模式:builder 简写为B,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

Builder :Builder_B 类
ConcreteBuilder:FerrariBuilder_B 类,可扩展性体现在这里
Director:Director_B 类,设置建造的顺序
Product:Car_B 类,得到产品

*/
public abstract class Builder_B {

    public abstract void BuildCarName ();
    public abstract void BuildCarDoor();
    public abstract void BuildCarWindow();
    public abstract void BuildCarWheel ();
    public abstract void BuildCarBody ();
    public abstract Car_B GetCar ();
}

 

using UnityEngine;

public class FerrariBuilder_B : Builder_B {
    
    private Car_B ferrari=new Car_B();

    public override void BuildCarName ()
    {
        ferrari.CarName = "法拉利";
    }

    public override void BuildCarDoor ()
    {
        Debug.Log ("给法拉利安装车门");
    }

    public override void BuildCarWindow ()
    {
        Debug.Log ("给法拉利安装车窗");
    }

    public override void BuildCarWheel ()
    {
        Debug.Log ("给法拉利安装车轱辘");
    }

    public override void BuildCarBody ()
    {
        Debug.Log ("生成出了一个法拉利车身");
    }

    public override Car_B GetCar ()
    {
        return ferrari;
    }

}

 

using UnityEngine;

public class Director_B {

    public void Construct(Builder_B builder)
    {
        Debug.Log ("我是总指挥,\n由我来决定所有车的组装顺序");
        builder.BuildCarName ();
        builder.BuildCarBody ();
        builder.BuildCarWheel ();
        builder.BuildCarDoor ();
        builder.BuildCarWindow ();
    }
}

 

using UnityEngine;

public class Car_B {
    
    private string carName;
    public string CarName {get;set;}

    public void ShowCar()
    {
        Debug.Log (CarName+"组装好了");
    }

}

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Client_B : MonoBehaviour {

    void Update () {

        //调用
        if (Input.GetKeyDown(KeyCode.F)) {
            Builder_B builder = new FerrariBuilder_B ();
            Director_B director = new Director_B ();
            director.Construct (builder);
            Car_B car = builder.GetCar ();
            car.ShowCar ();
        }
    }

}

 

posted on 2018-04-11 18:21  Jason_c  阅读(448)  评论(0编辑  收藏  举报