原文 第4章 建造者模式(Builder Pattern)

定义

将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。

实用范围

1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2 当构造过程必须允许被构造的对象有不同表示时。

角色

在这样的设计模式中,有以下几个角色:
1 builder:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。

4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

类关系图

举个简单的例子:我要需要造一个男人跟一个女孩

1.先定义一个人,跟男人女孩的具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  //人
    public class Person
    {
        //头
        private String head;
        //身体
        private String body;
        //脚
        private String foot;
 
        public String getHead()
        {
            return head;
        }
        public void setHead(String head)
        {
            this.head = head;
        }
 
        public String getBody()
        {
            return body;
        }
        public void setBody(String body)
        {
            this.body = body;
        }
        public String getFoot()
        {
            return foot;
        }
        public void setFoot(String foot)
        {
            this.foot = foot;
        }
    }
    //男人   product产品类
    public class Man : Person
    {
 
    }
    //女孩  product产品类
    public class girl : Person
    {
    }

2.抽象一个建造的工具,及具体的建造过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 //Builder 抽象建造者
    public interface PersonBuilder
    {
        void buildHead();
        void buildBody();
        void buildFoot();
        Person buildPerson();
    }
    //ConcreteBuilder 具体建造者
    public class ManBuilder : PersonBuilder
    {
        Person person;
        public ManBuilder()
        {
            person = new Man();
        }
        public void buildBody()
        {
            person.setBody("建造男人的身体");
        }
        public void buildFoot()
        {
            person.setFoot("建造男人的脚");
        }
        public void buildHead()
        {
            person.setHead("建造男人的头");
        }
        public Person buildPerson()
        {
            return person;
        }
    }
    public class GirlBuilder : PersonBuilder
    {
        Person person;
        public GirlBuilder()
        {
            person = new Man();
        }
        public void buildBody()
        {
            person.setBody("建造女孩的身体");
        }
        public void buildFoot()
        {
            person.setFoot("建造女孩的脚");
        }
        public void buildHead()
        {
            person.setHead("建造女孩的头");
        }
        public Person buildPerson()
        {
            return person;
        }
    }

3.最后建立一个场景,导演,或者是跟客户进行沟通的人

1
2
3
4
5
6
7
8
9
10
11
  //  Director类
    public class PersonDirector
    {
        public Person constructPerson(PersonBuilder pb)
        {
            pb.buildHead();
            pb.buildBody();
            pb.buildFoot();
            return pb.buildPerson();
        }
    }

4.根据客户的需求 给于不同的产品,比如需要一个男人,或者需要一个女人。

1
2
3
4
5
6
7
8
9
10
11
    class Program
    {
        static void Main(string[] args)
        {
            //建造一个男人
            Person man = new PersonDirector().constructPerson(new ManBuilder());
            //建造一个女孩
            Person girl = new PersonDirector().constructPerson(new GirlBuilder());
        }
 
    }

上面仅仅是建造者模式中的一种用法,不同的需求有很多种不同的用法,举例多了反而容易混。理解里面的核心就行了 ,建造者:就是不用管我怎么去建造的,告诉我你想要什么,我就内部加工,建造好了给你。

扩展

建造者演化的其它方式:

1.省略抽象建造者角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  //  Director类
    public class PersonDirector
    {
       //获取男人
        public Person GetManPerson()
        {
            ManBuilder pb=new ManBuilder ();
            pb.buildHead();
            pb.buildBody();
            pb.buildFoot();
            return pb.buildPerson();
        }
        //获取女孩
        public Person GetGirlPerson()
        {
            GirlBuilder pb=new GirlBuilder ();
            pb.buildHead();
            pb.buildBody();
            pb.buildFoot();
            return pb.buildPerson();
        }
    }
    //client
    class Program
    {
        static void Main(string[] args)
        {
            //建造一个男人
            Person man = new PersonDirector().GetManPerson;
            //建造一个女孩
            Person girl = new PersonDirector().GetManPerson;
        }
 
    }

2.省略指导者角色

      在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色,让Builder自己扮演指导者和建造者双重角色    //client

1
2
3
4
5
6
7
8
9
10
11
12
13
    class Program
    {
        static void Main(string[] args)
        {
            //建造一个男人
           ManBuilder pb=new ManBuilder ();
            pb.buildHead();
            pb.buildBody();
            pb.buildFoot();
            pb.buildPerson();
        }
 
    }

 

看到这之后 你有没发现,其实自己在开发的过程中进行的一些封装调用,用的就是建造者模式。O(∩_∩)O哈哈~ 不要怀疑你的眼睛。其实你已经早就在用了

优点

1.封装性:

使用建造者模式可以使客户端不必知道产品内部组成的细节。

2.独立,容易扩展

3.便于控制细节

建造者是独立的,因此可以对建造者的过程细化,而不对其它的额模块产生影响。

设计模式系列文章入口:http://www.diyibk.com/post/39.html

第4章 建造者模式(Builder Pattern)的更多相关文章

  1. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  2. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  3. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  4. 建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...

  5. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  6. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  7. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  8. Net设计模式实例之建造者模式(Builder Pattern)

    一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...

  9. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  10. 设计模式 - 建造者模式 Builder Pattern

    简介 场景 在创建复杂对象时,用户无须关心该对象所包含的属性以及它们的组装方式,只需要指定复杂对象的类型和内容就可以构建它们. 模式定义 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程 ...

随机推荐

  1. 8皇后-----回溯法C++编程练习

    /* * 八皇后问题回溯法编程练习 * 在8×8的棋盘上,放置8个皇后,两个皇后之间不能两两攻击 * 也即,直线,垂直45度.135度方向不能出现两个皇后 * * copyright Michael ...

  2. javascript 正则匹配 提取所有 preg_match_all matchAll方法

    javascript 提取全部的的方法.javascript中没有matchAll这种方法. 用while来实现类似 PHP 中的preg_match_all() :(by default7#zbph ...

  3. 经验19--C#大事

    以前学过C#大事.但我还没有搞懂怎么弄. 这一次,他们下进行了研究. 1.定义参数类,对于参数的传递活动.(可以省略) public class UserEventArgs     {         ...

  4. 【C语言探索之旅】 第一部分第七课:循环语句

    内容简介 1.课程大纲 2.第一部分第七课: 循环语句 3.第一部分第八课预告: 第一个C语言小游戏 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编 ...

  5. 顺序表----java实现

    最简单的数据结构--顺序表,此处以数组为例. 顺序表的优点:支持随机读取,内存空间利用率高. 顺序表的缺点:1.需要预先给出最大数据元素个数,这往往很难实现. 2.插入和删除时需要移动大量数据. Se ...

  6. .NET应用架构设计—工作单位模式(摆脱程序代码的重要思想,反击DDD)

    阅读文件夹: 1.背景介绍 2.过程式代码的真正困境 3.工作单元模式的简单演示样例 4.总结 1.背景介绍 一直都在谈论面向对象开发.可是开发企业应用系统时.使用面向对象开发最大的问题就是在于,多个 ...

  7. 【我们都爱Paul Hegarty】斯坦福大学IOS8公开组个人笔记28 ScrollView 幻灯片视图

    随着移动设备,iphone屏幕尺寸的限制.超过内容的屏幕大小为scrollview于,通过滑动来获得.scrollview滑动方向可以是也可以是横向垂直,scrollview可以嵌套,例如,纵向滑动s ...

  8. js中推断对象详细类型

    大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...

  9. Java 内存架构

    a)        执行. main()作为该程序的初始线的起点.无论由线程开始在其他线程. JVM有两个内螺纹:守护线程和非守护线程,main()它是一个非守护线程.常由JVM自己使用.java程序 ...

  10. unix pwd使用命令

    [语法]:     pwd [说明]:    此命令会显示当前的工作文件夹 []: pwd     这显示当前工作文件夹 版权声明:本文博主原创文章.博客,未经同意不得转载.