建造者模式(11)

今天,我们来讲一下建造者模式。

一、案例

我们来用winform画一个小人,一个头,一个身体,两只手,两条腿。

我们一般想到的代码如下:

 1         /// <summary>
 2         /// 画小人
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void pictureBox1_Paint(object sender, PaintEventArgs e)
 7         {
 8             Graphics gThin = e.Graphics;
 9             Pen p = new Pen(Color.Black, 2);
10             gThin.DrawEllipse(p, 50, 20, 30, 30);
11             gThin.DrawRectangle(p, 60, 50, 10, 50);
12             gThin.DrawLine(p, 60, 50, 40, 100);
13             gThin.DrawLine(p, 70, 50, 90, 100);
14             gThin.DrawLine(p, 60, 100, 40, 150);
15             gThin.DrawLine(p, 70, 100, 85, 150);
16         }

运行的效果:

嗯,好,下面,我们再画一个稍微胖一点的小人。

代码如下:

 1         private void pictureBox2_Paint(object sender, PaintEventArgs e)
 2         {
 3             Graphics gThin = e.Graphics;
 4             Pen p = new Pen(Color.Red, 2);
 5             gThin.DrawEllipse(p, 50, 20, 30, 30);
 6             gThin.DrawEllipse(p, 45, 50, 40, 50);
 7             gThin.DrawLine(p, 50, 50, 30, 100);
 8             gThin.DrawLine(p, 80, 50, 100, 100);
 9             gThin.DrawLine(p, 60, 100, 45, 150);
10         }

运行效果如下

咦,我们好像少花了条腿哦。

哈哈,像这样粗心的情况我们经常出现

二、演绎

1、第一步演绎

 1     /// <summary>
 2     /// 建造瘦小人的类
 3     /// </summary>
 4     class PersonThinBuilder
 5     {
 6         private Graphics _g;
 7         private Pen _p;
 8
 9         public PersonThinBuilder(Graphics g, Pen p)
10         {
11             this._g = g;
12             this._p = p;
13         }
14         /// <summary>
15         /// 建造小人
16         /// </summary>
17         public void Build()
18         {
19             _g.DrawEllipse(_p, 50, 20, 30, 30);
20             _g.DrawRectangle(_p, 60, 50, 10, 50);
21             _g.DrawLine(_p, 60, 50, 40, 100);
22             _g.DrawLine(_p, 70, 50, 90, 100);
23             _g.DrawLine(_p, 60, 100, 40, 150);
24             _g.DrawLine(_p, 70, 100, 85, 150);
25         }
26     }

客户端

1         private void pictureBox1_Paint(object sender, PaintEventArgs e)
2         {
3             Pen p = new Pen(Color.Black);
4             Graphics gThin = e.Graphics;
5             PersonThinBuilder ptb = new PersonThinBuilder(gThin, p);
6             ptb.Build();
7         }

我们进行了第一步的改革,看了一下代码,将客户端的画小人的过程一直到了一个类中,客户端只需要调用这个类就可以了,但是,这仍然没有解决我们上面提到的问题,如果我们要画一个胖一点的小人,我们还需要建一个类,然后再写一遍创建过程,很难保证落下什么东西(比如:少了一只手也说不定哦)

好,那么我们到底该如何解决呢?

下面就是我们将要介绍的 建造者模式。

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

如果我们使用了建造者模式,那么,用户只需要指定建造的类型就可以得到他们了,而具体的建造的细节和过程就不需要知道了。

那么,我们画小人的案例该怎样使用建造者模式呢?我们一步步来分析。

画小人,都需要画,头、身体、左手、右手、左腿、右腿。

好,下面呢,我们就先来定义一个抽象的画小人的类,将这个过程固定住,不让任何人遗忘当中的任何一步。

 1     abstract class PersonBuilder
 2     {
 3         protected Graphics G;
 4         protected Pen P;
 5
 6         protected PersonBuilder(Graphics g, Pen p)
 7         {
 8             G = g;
 9             P = p;
10         }
11
12         public abstract void BuildHead();
13         public abstract void BuildBody();
14         public abstract void BuildArmLeft();
15         public abstract void BuildArmRight();
16         public abstract void BuildLegLeft();
17         public abstract void BuildLegRight();
18     }

然后,我们需要建造一个瘦一点的小人,我们可以让瘦一点的小人去继承这个抽象类。那么这个类就必须重写抽象类中的方法了,要不编译不通过的。所以,画小人就不会丢三落四了。

 1     class PersonThinBuilder : PersonBuilder
 2     {
 3         public PersonThinBuilder(Graphics g, Pen p) : base(g, p)
 4         {
 5         }
 6
 7         public override void BuildHead()
 8         {
 9             G.DrawEllipse(P, 50, 20, 30, 30);
10         }
11
12         public override void BuildBody()
13         {
14             G.DrawRectangle(P, 60, 50, 10, 50);
15         }
16
17         public override void BuildArmLeft()
18         {
19             G.DrawLine(P, 60, 50, 40, 100);
20         }
21
22         public override void BuildArmRight()
23         {
24             G.DrawLine(P, 70, 50, 90, 100);
25         }
26
27         public override void BuildLegLeft()
28         {
29             G.DrawLine(P, 60, 100, 40, 150);
30         }
31
32         public override void BuildLegRight()
33         {
34             G.DrawLine(P, 70, 100, 85, 150);
35         }
36     }

同理,胖子小人类也用上面的方式,继承抽象类,代码差不多,就不在写了。

这样就完事了吗?如果完事了的话,那么我在客户端调用的时候,还是需要调用类里面的方法,万一哪一个方法没有调用,也就会出现丢三落四的情况了,这根本没有解决问题呀。所以,到这里,我们还没有完事呢。

建造者模式还有一个非常重要的类,指挥者类。指挥者类是用来控制建造过程的,同时它也是隔离用户与建造过程的关联的。

好,下面我们来写一个指挥者类。

 1     class PersonDirector
 2     {
 3         private PersonBuilder pb;
 4         //用户告诉指挥者,我需要什么样的小人
 5         public PersonDirector(PersonBuilder pb)
 6         {
 7             this.pb = pb;
 8         }
 9         //根据用户的选择建造小人
10         public void CreatePerson()
11         {
12             pb.BuildHead();
13             pb.BuildBody();
14             pb.BuildArmLeft();
15             pb.BuildArmRight();
16             pb.BuildLegLeft();
17             pb.BuildLegRight();
18         }
19     }

这样,指挥者类写好了。其实指挥者类就是根据用户的选择,来一步一步的建造小人,而建造的过程在指挥者里面已经完成了,用户就不需要知道了。

那么,客户端就是这样的了。

1         private void pictureBox1_Paint(object sender, PaintEventArgs e)
2         {
3             //瘦小人
4             PersonBuilder pb = new PersonThinBuilder(e.Graphics, new Pen(Color.Black));
5             //告诉建造者,我要创建一个瘦小人
6             PersonDirector pd = new PersonDirector(pb);
7             //开始创建
8             pd.CreatePerson();
9         }

ok,这样就成功的将我们的案例用建造者模式构建出来了。

好了,建造者模式今天就讲到这里了,下篇博文我们将 观察者模式



本系列将持续更新,喜欢的小伙伴可以点一下关注和推荐,谢谢大家的支持。

时间: 2024-10-13 16:57:56

建造者模式(11)的相关文章

设计模式之第11章-建造者模式(Java实现)

设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是了,正常来说如果是中餐的话,都是先凉菜再热菜,然后是汤,最后是一些甜品什么的.西餐呐,先有头盘,用来开胃的,然后是汤(感觉好怪的说),再然后是副菜.主菜.蔬菜类.甜品.饮料来着.然后法国嘛就是blablabla...”(作者已被众人拖走.“让我说完啊,就剩几个国家了~啊~~”).咳咳,题归正转.你问

设计模式——11.建造者模式

建造者模式(Builder) Builder模式简介: 将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定部分)可以创建不同的表示(变化). Builder模式结构: Builder模式要点: Builder模式主要用于分步骤构建一个复杂对象,其中的构建步骤是稳定的,而负责对象的各个部分则经常变化. 要注意不同语言例如C++.C#中构造函数内调用虚函数机制的差别. C++代码 C#代码 REF 书籍: 设计模式与游戏开发.大话设计模式 GitHub: https://github.co

Java设计模式学习笔记,三:建造者模式

建造者模式:实现了构建和装配的解耦,即对象的各个子组件单独构建,再进行装配,从而建造完整对象. 该模式适用于构建较为复杂的对象(多个子组件). 不同的构建者,使用相同的装配者,可以建造不同的对象实例.相同的构建者,不同的装配顺序,也可能建造出不同的对象实例. 举例: 汽车对象,子组件包括引擎.轮子和车体. Audi汽车构建者,负责制造Audi牌各个子组件.BMW汽车构建者,负责制造BMW牌各个子组件.然后将子组件统一送至汽车装配者的生产线中进行组装,最后会建造出Audi牌汽车和BMW汽车. 以下

设计模式—建造者模式

1 建造者模式  将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者返回给客户一个完整的产品对象,而客户端无须关心该对象所包含的属性和组建方式,这就是建造者模式的设计动机. 2  模式解析 建造者模式通常包括下面几个角色: 1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造.这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建. 2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复

设计模式学习-建造者模式

1.定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.类图 3.代码示例 1 package com.zhaoyangwoo.builder; 2 3 /** 4 * Created by john on 16/5/7. 5 * 场景类 6 */ 7 public class Builder { 8 9 public static void Main(){ 10 BuilderInterface bi = new ConceptBuilder(); 11 Di

23种设计模式----------建造者模式

建造者模式:像是模板方法模式的升级.也叫生成器模式.将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示.其实就是创建一大类的东西, 但是具体又有些差异. 在建造者模式中,一般有四个角色: 1,Product产品类. 该类一般实现了模板方法模式. 2,Builder抽象的建造者. 规范产品的组建,一般是由子类实现. 3,ConcreteBuilder具体的建造者. 实现抽象类定义的所有方法,并且可以返回一个组建好的具体对象. 4,Director导演类(一般是包涵多种具体产品

建造者模式(Java与Kotlin版)

前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) 抽象工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次尝试用Kotlin实现Android项目 1. 定义 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2. 结构 Product:产品角色:

(@WhiteTaken)设计模式学习——建造者模式

Builder模式,也就是建造者模式或者生成器模式,是GoF提出的23种设计模式的一种. 这种模式是用来隐式的创建复合对象而提出来的. 创建复合对象的过程,不在主客户端显示. 下面直接上代码.以修建房屋为例子. 1.修建房屋,我们需要实例化一个房子,房子需要能修建门.地板.墙壁等.这时候我们需要有一个房子类.我们需要为其添加get set方法. 1 /* 2 * 房子 可以修建门窗.地板.墙 3 */ 4 public class House { 5 private String door; 6

设计模式之建造者模式Builder(创建型)

1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定. 例子1:买肯德基 典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡.炸鸡.可乐和玩具车).这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的.        客户端:顾客,想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择.