您的位置:首页 > 移动开发 > Unity3D

【设计模式】使用unity实现建造者模式(Builder mode)

2017-04-06 19:48 891 查看
阅读《大话设计模式》后,自己根据unity的特性写的一个简单demo,如有不妥之处,欢迎评论纠正....

首先贴上书中关于建造者模式的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 建造者模式
{
public class Product
{
IList<string> parts = new List<string>();

public void Add(string part)
{
parts.Add(part);
}

public void Show()
{
Console.WriteLine("\n产品 创建--------");
foreach (string  part in parts)
{
Console.WriteLine(part);
}
}
}

public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}

public class ConcreteBuilder1 : Builder
{
private Product product = new Product();

public override void BuildPartA()
{
product.Add("部件A");
}

public override void BuildPartB()
{
product.Add("部件B");
}

public override Product GetResult()
{
return product;
}
}

public class ConcreteBuilder2 : Builder
{
private Product product = new Product();

public override void BuildPartA()
{
product.Add("部件X");
}

public override void BuildPartB()
{
product.Add("部件Y");
}

public override Product GetResult()
{
return product;
}
}

public class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
}


客户端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 建造者模式
{
class Program
{
static void Main(string[] args)
{
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();

director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();

director.Construct(b2);
Product p2 = b2.GetResult();
p2.Show();

Console.ReadKey();
}
}
}


然后下面是我写的使用unity实现建造者模式(builder mode)的unity代码:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class UIView
{
protected Text mText;
protected Text mBtnText;
protected Image mImage;

public void Init(Transform transform)
{
mText = Instantiate(transform, "UIView/MyText").GetComponent<Text>();
Button button = Instantiate(transform, "UIView/Button").GetComponent<Button>();
mBtnText = transform.Find("Button(Clone)/Text").GetComponent<Text>();
mImage = Instantiate(transform, "UIView/Image").GetComponent<Image>();
}

protected GameObject Load(string path)
{
return Resources.Load<GameObject>(path);
}

protected GameObject Instantiate(Transform parent, string path)
{
GameObject go = GameObject.Instantiate(Load(path));
go.transform.SetParent(parent, false);
//go.transform.localScale = Vector3.one;
//go.transform.position = Vector3.zero;
return go;
}

}

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public abstract class Builder : UIView
{
public  abstract void BuilderMethodA();
// protected abstract void BuilderMethodB();
public abstract Product GetResult();
}

public class Product
{
List<UIView> parts = new List<UIView>();

public void Add(UIView go)
{
if (go is ConcreteBuilder1)
parts.Add(go as ConcreteBuilder1);
if (go is ConcreteBuilder2)
parts.Add(go as ConcreteBuilder2);
}

public void Show()
{
foreach (UIView go in parts)
{
if(go is ConcreteBuilder1)
{
ConcreteBuilder1 b1 = go as ConcreteBuilder1;
b1.BuilderMethodA();
}
if(go is ConcreteBuilder2)
{
(go as ConcreteBuilder2).BuilderMethodA();
}
}
}
}

public class Director
{
public void Construct(Builder builder)
{
builder.BuilderMethodA();
}
}


using UnityEngine;
using System.Collections;

public class ConcreteBuilder1 : Builder
{
private Product product = new Product();
public override void BuilderMethodA()
{
mText.text = "建造者A";
mBtnText.text = "建造者A按钮";
mImage.color = Color.red;
}

public override Product GetResult()
{
return product;
}
}

public class ConcreteBuilder2 : Builder
{
private Product product = new Product();
public override void BuilderMethodA()
{
mText.text = "建造者B";
mBtnText.text = "建造者B按钮";
mImage.color = Color.green;
}

public override Product GetResult()
{
return product;
}
}


Test.cs

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

void OnGUI()
{
if(GUI.Button(new Rect(100, 100, 120, 50), "按钮1"))
{
Director director = new Director();
Builder b1 = new ConcreteBuilder1();

b1.Init(this.transform);

director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();
}

if (GUI.Button(new Rect(100, 200, 120, 50), "按钮2"))
{

Director director = new Director();
Builder b2 = new ConcreteBuilder2();

b2.Init(this.transform);

director.Construct(b2);
Product p2 = b2.GetResult();
p2.Show();
}
}
}


运行效果图:





写在最后:

由于个人能力,对于实现建造者模式上,存在很大的不足,如果各位看官对此有建议,欢迎评论。在此致谢!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: