设计模式 - 10)建造者模式
发布日期:2021-05-13 19:47:08 浏览次数:20 分类:博客文章

本文共 4093 字,大约阅读时间需要 13 分钟。

假设你是个木工手艺人,会做各种高矮胖瘦的人物,现在让你做一个男生和女生。

class Person{    Ilist
parts = new List
(); public void Add(string part) { parts.Add(part); } public void Show() { Console.WriteLine }}
class PersonWomanBuilder{    public void Builder()    {        Console.WriteLine("女头 ");        Console.WriteLine("女脖子");        Console.WriteLine("女手 ");        Console.WriteLine("女脚 ");        Console.WriteLine("女身体");        Console.WriteLine("女眉毛");    }}class PersonManBuilder{    public void Builder()    {        Console.WriteLine("男头 ");        Console.WriteLine("男脖子");        Console.WriteLine("男手 ");        Console.WriteLine("男脚 ");        Console.WriteLine("男身体");    }}    PersonWomanBuilder womanBuilder = new PersonWomanBuilder ();womanBuilder .Builder();PersonManBuilder manBuilder = new PersonManBuilder();manBuilder .Builder();

很明显,上面在做男生的时候,漏了一个步骤,加男眉毛。

因此我们建一个抽象类,让各种人物都需要继承这个抽象类,实现规定的抽象方法。

abstract class PersonBuilder{    public abstract void BuildHead();    public abstract void BuildNeck();    public abstract void BuildHand();    public abstract void BuildLeg();    public abstract void BuildBody();    public abstract void BuildEyebrow();}class PersonManBuilder : PersonBuilder{    public override void BuildBody()    {        Console.WriteLine("男身体");    }    public override void BuildHand()    {        Console.WriteLine("男手");    }    ...}class PersonWomanBuilder : PersonBuilder{    public override void BuildBody()    {        Console.WriteLine("女身体");    }    public override void BuildHand()    {        Console.WriteLine("女手");    }}

到这一步,我们就可以避免建造人物的时候,缺失步骤。

然后我们再设计一个指挥官,用它来控制建造的控制,避免需要在客户端依次调用建造人物的各个部位,从而避免漏掉用某个部位,隔离用户与建造过程的关联。

class PersonDirector{    PersonBuilder pb;        public PersonDirector(PersonBuilder pb)    {        this.pb = pb;    }    public void CreatePerson()    {        pb.BuildHead();        pb.BuildNeck();        pb.BuildBody();        pb.BuildHand();        pb.BuildLeg();        pb.BuildMao();    }}// 业务代码PersonDirector pdWoman = new PersonDirector(new PersonWomanBuilder());pdWoman.CreatePerson();PersonDirector pdMan = new PersonDirector(new PersonManBuilder());pdMan.CreatePerson();

深入理解一下:

class PersonProduct{    IList
parts = new List
(); public void Add(string part) { parts.Add(part); } public void Show() { Console.WriteLine("\n产品 创建:"); foreach (string part in parts) { Console.WriteLine(part); } }}abstract class PersonBuilder{ public abstract void BuilderPartA(); public abstract void BuilderPartB(); public abstract PersonProduct GetResult();}class ManPersonBuilder : PersonBuilder{ private PersonProduct product = new PersonProduct(); public override void BuilderPartA() { product.Add("部件A"); } public override void BuilderPartB() { product.Add("部件B"); } public override PersonProduct GetResult() { return product; }}class WomanPersonBuilder : PersonBuilder{ private PersonProduct product = new PersonProduct(); public override void BuilderPartA() { product.Add("部件X"); } public override void BuilderPartB() { product.Add("部件Y"); } public override PersonProduct GetResult() { return product; }}class Director{ public void Construct(PersonBuilder pb) { pb.BuilderPartA(); pb.BuilderPartB(); }} public class BuilderViewModel{ public BuilderViewModel() { Director dc = new Director(); ManPersonBuilder mpb = new ManPersonBuilder(); dc.Construct(mpb); PersonProduct pp1 = mpb.GetResult(); pp1.Show(); WomanPersonBuilder wmpb = new FatPersonBuilder(); dc.Construct(wmpb); PersonProduct pp2 = wmpb.GetResult(); pp2.Show(); }}
  1. 设计一个产品 product,设计一个生产者 Builder 抽象类,规定需要实现的方法,设计一个指挥官 Director,实现一个生产流程(传入一个生产者,执行生产者的某些方法);
  2. 设计不同类型的生产者继承 Builder,不同的生产者实现抽象方法,在抽象方法中实现各自对产品 product 的设计;
  3. 将不同类型的生产者 builder 传入并由 指挥官 director 指挥 生产 产品 product。

可用于生成 不同皮肤、不同大小的人物 等场景。

上一篇:设计模式 - 11)观察者模式
下一篇:设计模式 - 9) 外观模式

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月21日 09时07分16秒