建造者模式

介绍

建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

结构图:


角色

1 Builder:是为了创建一个Product对象的各个部件指定的抽象接口
2 ConcreteBuilder:具体建造者,实现Builder的接口,构造和装配各个部件
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

以大话设计模式艺术的例子为例(建造小人的例子)

代码结构图


新建一个类命名为PersonBuilder,然后在命名空间添加using System.Drawing;和using System.Reflection;

PersonBuilder类代码

abstract class PersonBuilder
    {
        protected Graphics g;
        protected Pen p;

        public PersonBuilder(Graphics g, Pen p)
        {
            this.g = g;
            this.p = p;
        }
        public abstract void BuildHead();
        public abstract void BuildBody();
        public abstract void BuildArmLeft();
        public abstract void BuildArmRight();
        public abstract void BuildLegLeft();
        public abstract void BuildLegRight();
    }
    class PersonThinBuilder : PersonBuilder
    {
        public PersonThinBuilder(Graphics g, Pen p)
            : base(g, p)
        { }

        public override void BuildHead()
        {
            g.DrawEllipse(p, 50, 20, 30, 30);
        }

        public override void BuildBody()
        {
            g.DrawRectangle(p, 60, 50, 10, 50);
        }

        public override void BuildArmLeft()
        {
            g.DrawLine(p, 60, 50, 40, 100);
        }

        public override void BuildArmRight()
        {
            g.DrawLine(p, 70, 50, 90, 100);
        }

        public override void BuildLegLeft()
        {
            g.DrawLine(p, 60, 100, 45, 150);
        }

        public override void BuildLegRight()
        {
            g.DrawLine(p, 70, 100, 85, 150);
        }
    }//建造瘦小人
    class PersonFatBuilder : PersonBuilder
    {
        public PersonFatBuilder(Graphics g, Pen p)
            : base(g, p)
        { }

        public override void BuildHead()
        {
            g.DrawEllipse(p, 50, 20, 30, 30);
        }

        public override void BuildBody()
        {
            g.DrawEllipse(p, 45, 50, 40, 50);
        }

        public override void BuildArmLeft()
        {
            g.DrawLine(p, 50, 50, 30, 100);
        }

        public override void BuildArmRight()
        {
            g.DrawLine(p, 80, 50, 100, 100);
        }

        public override void BuildLegLeft()
        {
            g.DrawLine(p, 60, 100, 45, 150);
        }

        public override void BuildLegRight()
        {
            g.DrawLine(p, 70, 100, 85, 150);
        }
    }//建造胖小人
    class PersonDirector
    {
        private PersonBuilder pb;
        public PersonDirector(string type, Graphics g, Pen p)
        {
            string assemblyName = "建造者模式";
            object[] args = new object[2];
            args[0] = g;
            args[1] = p;

            this.pb = (PersonBuilder)Assembly.Load(assemblyName).CreateInstance(assemblyName + ".Person" + type + "Builder", false, BindingFlags.Default, null, args, null, null);
        }
        public void CreatePerson()
        {
            pb.BuildHead();
            pb.BuildBody();
            pb.BuildArmLeft();
            pb.BuildArmRight();
            pb.BuildLegLeft();
            pb.BuildLegRight();
        }
    }
然后再添加一个Form1窗体,在Form1中添加一个Button按钮和两个PictureBox控件在命名空间添加using System.Drawing;和using System.Windows.Forms;

Form1代码

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Pen p = new Pen(Color.Yellow);
            PersonDirector pbThin=new PersonDirector("Thin",pictureBox1.CreateGraphics(),p);
            pbThin.CreatePerson();          
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Pen p = new Pen(Color.Yellow);
            PersonDirector pdFat = new PersonDirector("Fat", pictureBox2.CreateGraphics(), p);
            pdFat.CreatePerson();
        }     
    }

然后在Program.cs中写入代码

[STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
最后将解决方法的输出属性改为Windows 应用程序,这样就不会先弹出控制台程序。

效果图


Builder是建造一个抽象小人各个部分的抽象类、Produc是那些具体的小人、ConcreBuilder是具体的小人建造者,实现Builder接口,构造和装配各个部件、Director是用来根据用户的需求构建小人对象。

优点:

1、隔离了构建和具体的实现,为产品的具体实现提供了灵活性
2、封装和抽象了每个步骤的实现,实现了依赖倒转原则
3、封装了具体的步骤,减少了代码的冗余

缺点:

1、要求构建产品的步骤(算法)是不能剧烈变化的,最好是不变的,这样影响了灵活度。


再举个例子

大家都喜欢人民币,其实印刷人民币也是使用了建造者模式,根据国家的需求印刷工印刷不同面值的人民币

根据建造者模式的结构图我们可以

Director相当于国家

Builder表示:印刷人名币的步骤

ConcreteBuilder表示:印刷不同面值人民币(不同面值有不同t图案)

Product表示:5毛的、1元的、5元的...

举的例子,有些牵强,不过能够大概的表达建造者模式的思想。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值