【设计模式】使用unity实现建造者模式(Builder mode)
2017-04-06 19:48
891 查看
阅读《大话设计模式》后,自己根据unity的特性写的一个简单demo,如有不妥之处,欢迎评论纠正....
首先贴上书中关于建造者模式的代码:
客户端:
然后下面是我写的使用unity实现建造者模式(builder mode)的unity代码:
Test.cs
运行效果图:
写在最后:
由于个人能力,对于实现建造者模式上,存在很大的不足,如果各位看官对此有建议,欢迎评论。在此致谢!!!
首先贴上书中关于建造者模式的代码:
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(); } } }
运行效果图:
写在最后:
由于个人能力,对于实现建造者模式上,存在很大的不足,如果各位看官对此有建议,欢迎评论。在此致谢!!!
相关文章推荐
- 【设计模式】使用unity实现外观模式(Facade mode)
- 【设计模式】使用unity实现模板模式(Template mode)
- 设计模式C++实现(6)——建造者模式(Builder)
- 【设计模式】使用unity实现代理模式(Proxy mode)
- 设计模式之—建造者模式(Builder)-Java实现
- 【Unity】使用C#中的委托类型实现代理设计模式
- 23种设计模式之建造者模式(创建型,4 Builder,c++实现)
- 设计模式——创建型之使用建造者模式(Builder Pattern)灵活自由创建你的对象(一)
- 我所理解的设计模式(C++实现)——建造者模式(Builder Pattern)
- 我所理解的设计模式(C++实现)——建造者模式(Builder Pattern)
- 设计模式 - 建造者模式(Builder) C++实现
- Python实现设计模式--05.建造者模式(Builder Pattern)
- 【设计模式】使用unity实现策略模式(strategy model)
- 设计模式(三)之建造者模式(Builder) C++实现
- 【设计模式】使用unity实现状态模式(State mode)
- 设计模式C++实现(3)——建造者模式(Builder)
- 我所理解的设计模式(C++实现)——建造者模式(Builder Pattern)
- [置顶] 【设计模式】使用unity实现观察者模式(delegate,event)
- 我所理解的设计模式(C++实现)——建造者模式(Builder Pattern)
- 设计模式之C#实现(二)---Builder