建造者模式

介绍

建造者模式(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
    评论
Android中的建造者模式是一种设计模式,用于创建复杂对象。它提供了一种流畅的方式来构建对象,使得代码更易读、易维护。在Android开发中,建造者模式常常用于创建具有多个可选参数的对象,以及避免使用过多的构造函数重载。 建造者模式由以下几个组成部分: 1. 产品类(Product):要创建的复杂对象。 2. 抽象建造者类(Builder):定义了创建产品各个部分的抽象方法。 3. 具体建造者类(Concrete Builder):实现抽象建造者接口,负责具体产品部件的构建。 4. 指导者类(Director):负责调用具体建造者来构建产品对象。 5. 客户端(Client):使用指导者来构建产品对象。 在Android中,我们可以根据具体需求来自定义建造者模式。例如,在创建一个用户对象时,可以使用建造者模式来设置用户的各个属性(如用户名、年龄、性别等),以及可选的属性(如地址、电话等)。这样可以避免使用多个构造函数来处理不同的参数组合,并且使代码更加清晰和可扩展。 下面是一个简单的示例代码: ```java public class User { private String username; private int age; private String gender; private String address; private String phone; private User(Builder builder) { this.username = builder.username; this.age = builder.age; this.gender = builder.gender; this.address = builder.address; this.phone = builder.phone; } public static class Builder { private String username; private int age; private String gender; private String address; private String phone; public Builder setUsername(String username) { this.username = username; return this; } public Builder setAge(int age) { this.age = age; return this; } public Builder setGender(String gender) { this.gender = gender; return this; } public Builder setAddress(String address) { this.address = address; return this; } public Builder setPhone(String phone) { this.phone = phone; return this; } public User build() { return new User(this); } } } // 使用示例 User user = new User.Builder() .setUsername("John") .setAge(25) .setGender("Male") .build(); ``` 在上述示例中,User类是要创建的复杂对象,Builder类是具体建造者类。通过调用Builder类的方法来设置各个属性,并最后调用build()方法返回构建的User对象。这样可以灵活地创建具有不同属性组合的User对象,而无需使用多个构造函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值