大话设计模式之建造者模式

简介: <p><span style="font-family:KaiTi_GB2312; font-size:24px"><strong>一.引入</strong></span></p> <p><span style="font-family:KaiTi_GB2312; font-size:24px">大鸟与小菜吃到的炒面味道不同,而类似肯德基的快餐则不会出现这样情况。其中的原因就是他们的工作

一.引入

大鸟与小菜吃到的炒面味道不同,而类似肯德基的快餐则不会出现这样情况。其中的原因就是他们的工作流程是非常规范的,时间、温度、热度都确定。这里的工作流程就是一种抽象的流程,此话我们如何去理解呢?

二.解决过程

① 建造小人一

<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="white-space:pre">	</span>    Graphics gThin = pictureBox1.CreateGraphics();
            gThin.DrawEllipse(p, 50, 20, 30, 30);
            gThin.DrawRectangle(p, 60, 50, 10, 50);
            gThin.DrawLine(p, 60, 50, 40, 100);
            gThin.DrawLine(p, 70, 50, 90, 100);
            gThin.DrawLine(p, 60, 100, 45, 150);
            gThin.DrawLine(p, 70, 100, 85, 150);</span>
这样,每次建造一个小人都需要写画头、身体、两手和两脚,很麻烦,也很容易出错。所以,还是需要创建类。

② 建造小人二

创建瘦人类:

<span style="font-family:KaiTi_GB2312;font-size:24px;">class PersonFatBuilder
    {
        private Graphics g;
        private Pen p;

        public PersonFatBuilder(Graphics g, Pen p)
        {
            this.g = g;
            this.p = p;
        }
        public void Build()
        {
            g.DrawEllipse(p, 50, 20, 30, 30);
            g.DrawRectangle(p, 45, 50, 40, 50);
            g.DrawLine(p, 50, 50, 30, 100);
            g.DrawLine(p, 80, 50, 100, 100);
            g.DrawLine(p, 60, 100, 45, 150);
            g.DrawLine(p, 70, 100, 85, 150);
        }

    }</span>

同样可以建造一个胖人类。

这样,确实解决了复用代码建造小人,但是炒面没放盐的问题还是没有解决。在编程的过程中,还是可能丢失小人的某一个部分。所以,就要应用建造者模式。

③ 建造者模式建造小人

定义抽象的建造人的类:

<span style="font-family:KaiTi_GB2312;font-size:24px;">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();

    }</span>

瘦人继承抽象类:

<span style="font-family:KaiTi_GB2312;font-size:24px;">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);
        }</span>

其他的胖人类,高人类,也可以像这样自己构造。

指挥者类:

<span style="font-family:KaiTi_GB2312;font-size:24px;">class PersonDirector
    {
        private PersonBuilder pb;
        public PersonDirector(PersonBuilder pb)//用户告诉指挥者,需要建什么样的人
        {
            this.pb = pb;
        }
        public void CreatePerson()//根据用户的选择建造小人
        {
            pb.BuildHead();
            pb.BuildBody();
            pb.BuildArmLeft();
            pb.BuildArmRight();
            pb.BuildLegLeft();
            pb.BuildLegRight();
        }
    }</span>

这样,指挥者根据用户选择一步步建造小人,并且不会遗忘小人的各个部位。

三.应用模式

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

好处:使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以。

四.学习心得

其实, 想想生活实际中,处处都是建造者模式。其本质就是产品与构件相分离。每个构件都是产品中必不可少的。所以说,为了避免构件的丢失,就将产品中需要用到的那些构件组合在一起。比如:电脑产品,其中,输入设备、输出设备和主机三个部件不可少,有了它们,就有不同的电脑产品。将书上的定义用生活的角度来看,其实就很容易理解了。

目录
相关文章
|
7月前
|
设计模式 Java
【设计模式系列笔记】建造者模式
建造者模式是一种创建型设计模式,用于将复杂对象的构建与其表示分离,使构建过程可定制。关键元素包括产品类(定义要构建的对象)、建造者接口(定义构建方法)、具体建造者类(实现构建过程)和指导者类(负责构建过程)。通过建造者模式,客户端可以灵活地创建具有不同表示的复杂对象,提高代码的可读性和可维护性,尤其适用于构建过程复杂且包含多个可选部分的情况。
134 1
|
7月前
|
设计模式 安全 Java
构建未来应用:Java设计模式 - 建造者模式(Builder)在现代编程中的应用
【4月更文挑战第7天】建造者模式是提升代码质量的关键,尤其在复杂环境中。它分步骤构建对象,将构建与表示分离,适用于UI构建、数据模型组装、配置文件解析和网络请求构造等场景。最佳实践包括明确构建步骤、提供默认值、支持链式调用和确保线程安全。然而,过多步骤、不一致状态和性能问题是使用时需注意的问题。掌握建造者模式对于现代编程至关重要。
87 3
|
3月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
27天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
3月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
4月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
6月前
|
设计模式 算法
建造者模式-大话设计模式
建造者模式-大话设计模式
|
7月前
|
设计模式 uml
大话设计模式(3)——造物者一般的建造者模式
大话设计模式(3)——造物者一般的建造者模式
43 1
大话设计模式(3)——造物者一般的建造者模式
|
5月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
57 0
|
6月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)