DesignPattern_Builder
摘录自:设计模式与游戏完美开发
十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合式的项目教学,即以一个游戏的范例来应用23种设计模式的实现贯穿全书,让读者学习到整个游戏开发的全过程和作者想要传承的经验,并以浅显易懂的比喻来解析难以理解的设计模式,让想深入了解此领域的读者更加容易上手。
工程GitHub
BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。
建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。
using UnityEngine;
using System.Collections.Generic;
namespace DesignPattern_Builder
{
// 含有复杂零件的产品
public class Product
{
private List<string> m_Part = new List<string>();
public Product(){}
public void AddPart(string Part)
{
m_Part.Add(Part);
}
public void ShowProduct()
{
Debug.Log("ShowProduct Functions:");
foreach(string Part in m_Part)
Debug.Log(Part);
}
}
// 生成一个产品的抽象类
public abstract class Builder
{
public abstract void BuildPart1(Product theProduct);
public abstract void BuildPart2(Product theProduct);
}
// 组装A产品
public class ConcreteBuilderA : Builder
{
public override void BuildPart1(Product theProduct)
{
theProduct.AddPart( "ConcreteBuilderA_Part1");
}
public override void BuildPart2(Product theProduct)
{
theProduct.AddPart( "ConcreteBuilderA_Part2");
}
}
// 组装B产品
public class ConcreteBuilderB : Builder
{
public override void BuildPart1(Product theProduct)
{
theProduct.AddPart( "ConcreteBuilderB_Part1");
}
public override void BuildPart2(Product theProduct)
{
theProduct.AddPart( "ConcreteBuilderB_Part2");
}
}
// 建造管理 就是理由Builder来建造一个产品
public class Director
{
private Product m_Product;
public Director(){}
// 建造
public void Construct(Builder theBuilder)
{
// 开始组装产品
m_Product = new Product();
theBuilder.BuildPart1( m_Product );
theBuilder.BuildPart2( m_Product );
}
// 取得成品
public Product GetResult()
{
return m_Product;
}
}
}
using UnityEngine;
using System.Collections;
using DesignPattern_Builder;
public class BuilderTest : MonoBehaviour
{
void Start()
{
UnitTest();
}
void UnitTest()
{
// 建造
Director theDirectoir = new Director();
Product theProduct = null;
// 使用BuilderA建立
theDirectoir.Construct(new ConcreteBuilderA());
theProduct = theDirectoir.GetResult();
theProduct.ShowProduct();
// 使用BuilderB建立
theDirectoir.Construct(new ConcreteBuilderB());
theProduct = theDirectoir.GetResult();
theProduct.ShowProduct();
}
}