`
laughingchs
  • 浏览: 69266 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Builder生成器模式2——转载

 
阅读更多

 Builder生成器模式是一种创建型模式,它主要是应对项目中一些复杂对象的创建工作。所谓“复杂对象”,是只:此对象中还含有其它的子对象。Builder模式所面对的情况是:各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定。简单的说:子对象变化较频繁,对算法相对稳定。

       这是解决一个复杂对象的创建工作,现在变化的部分和相对稳定的部分已经明确,我们要做的是隔离变化,如何将子对象和算法隔离是要解决的问题。

       《设计模式》中说道:将一个复杂对象的构建与其表示向分离,使得同样的构建过程可以创建不同的表示。

       我们现在定义一个场景:还是选择汽车,BMWBORA。试想一下,如果我们用较为普通的写法可以写成如下代码:

public static void Main()

        {

            Car car = new Car();

            Console.Write("Wheel:" + car._wheel + "\n");

            Console.Write("OilBox:" + car._oilBox + "\n");

            Console.Write("Body:" + car._body + "\n");

            Console.Read();

        }

 

        public class Car

        {

            public string _wheel = BMWWheel;

            public string _oilbox = BMWOilBox;

            public string _body = BMWBody;

}

当我们不确定或因需求变化而改变对汽车品牌的选择时,我们也许会频繁的更改Car类中的实现。

现在我们用Manager来管理汽车的构建。当然是构建一个抽象的类对象(对象如下图的builder,抽象类为AbstractBuilder,对于BMWBORA的构建类型继承AbstractBuilder

 


首先我们先来编写
AbstractBuilder抽象类的实现,代码如下:

public abstract class AbstractBuilder

    {

        public string _wheel;

        public string _oilBox;

        public string _body;

        public abstract void BuildWheel();

        public abstract void BuildOilBox();

        public abstract void BuildBody();

 

        public abstract Car GetCar();  

    }

 

    public abstract class Car

    {

    }

然后我们再来实现BMWBORA的构建,也就是Builder模式中频繁变化的部分,他们都要继承AbstractBuilder

BMW

public class BMWBuilder:AbstractBuilder

    {

        public BMWBuilder()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

 

        public override void BuildWheel()

        {

            _wheel = "BMWWheel";

        }

 

        public override void BuildOilBox()

        {

            _oilBox = "BMWOilBox";

        }

 

        public override void BuildBody()

        {

            _body = "BMWBody";

        }

 

        public override Car GetCar()

        {

            return new BMWCar();

        }

 

    }

 

    public class BMWCar:Car

    {}

BORA

public class BORABuilder:AbstractBuilder

    {

        public BORABuilder()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

 

        public override void BuildWheel()

        {

            _wheel = "BORAWheel";

        }

 

        public override void BuildOilBox()

        {

            _oilBox = "BORAOilBox";

        }

 

        public override void BuildBody()

        {

            _body = "BORABody";

        }

 

        public override Car GetCar()

        {

            return new BORACar();

        }

    }

 

    public class BORACar:Car

    {}

现在我们使用一种Manager方法来管理汽车的构建,这也就是Builder模式中提到的相对稳定的算法,我用一个类来实现:

private class CarManager

        {

            public BuilderClass.Car CreateCar(BuilderClass.AbstractBuilder builder)

            {

                builder.BuildBody();

                builder.BuildOilBox();

                builder.BuildWheel();

 

                Console.Write("Wheel:" + builder._wheel + "\n");

                Console.Write("OilBox:" + builder._oilBox + "\n");

                Console.Write("Body:" + builder._body + "\n");

                Console.Read();

                return builder.GetCar();

            }

        }

现在我们可以在客户程序中调用这个Manager来构建Car

public static void Main()

        {

            CarManager manager = new CarManager();

            BuilderClass.Car car =

manager.CreateCar(new BuilderClass.BORABuilder());

        }

结果如下:

Wheel:BORAWheel

OilBox:BORAOilBox

Body:BORABody

如果我们现在要换成BMW,我们只要在Main()函数中改变manager.CreateCar中的参数就可以:

public static void Main()

        {

            CarManager manager = new CarManager();

            BuilderClass.Car car =  

manager.CreateCar(new BuilderClass.BMWBuilder());

        }

结果如下:

Wheel:BMWWheel

OilBox:BMWOilBox

Body:BMWBody

这样,经过简单的修改可以实现对不同Car的构建。如果我们还有其他汽车的实现只要将他的类继承AbstractBuilder,然后在Main()中修改就可以。说道这里,我想起了在第一篇中提到的设计模式中的“开---闭原则”,这个方式是很符合这个原则的,对代码进行了扩展,以减少了代码修改量。而且我们还有很多方法可以利用,如:WebConfig中的appSettings来动态的配置,从数据库中读取,或利用依赖方式动态生成。

现在我们再来看看Builder模式的几个要点:

Builder模式主要用于构建一个复杂的对象,但这个对象构建的算法是稳定的,对象中的各个部分经常变化。Builder模式主要在于应对复杂对象各个部分的频繁需求变动。但是难以应对算法的需求变动。这点一定要注意,如果用错了,会带来很多不必要的麻烦。

课程中还提到了.Net中的Builder模式的应用。如:Page类中的OnInit()等方法的实现。我们在写一个Web页面的时候。他的codebehind代码都是继承System.Web.UI.Page基类的。OnInit()函数是可以重写的

 

分享到:
评论

相关推荐

    C#设计模式之Builder生成器模式解决带老婆配置电脑问题实例

    本文主要介绍了C#设计模式之Builder生成器模式解决带老婆配置电脑问题,简单介绍了生成器模式的概念、功能并结合具体实例形式分析了C#生成器模式解决配电脑问题的步骤与相关操作技巧。 一、 Builder生成器模式定义 ...

    【设计模式】- 生成器模式(Builder)(csdn)————程序.pdf

    生成器模式,也称为建造者模式,是一种设计模式,用于创建复杂对象,它允许你按照一系列步骤来构造对象,而这些步骤可以通过不同的实现来产生不同形式的对象。生成器模式的核心在于分离了对象的构造过程和表示细节,...

    生成器模式builder

    生成器模式(Builder Pattern)是一种设计模式,它允许我们分步骤构建复杂对象,而无需暴露其构造过程。这种模式在创建对象时提供了更大的灵活性,特别是当构造过程需要多个步骤或者对象有不同的构造方式时。Builder...

    C#面向对象设计模式纵横谈(4):Builder 生成器模式(创建型模式)

    在C#中,Builder模式常常应用于游戏对象生成、配置文件解析、数据库记录映射等领域。例如,游戏中的角色创建,可能需要设置角色的属性、技能等,这些可以通过不同的Builder来实现;而在数据库操作中,ORM框架如...

    C#面向对象设计模式纵横谈\4 创建型模式Builder生成器模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第4节:创建型模式Builder生成器模式

    C#面向对象设计模式4:生成器(Builder)

    生成器模式通常由四个主要角色组成:Director(导演)、Concrete Builder(具体生成器)、Product(产品)和Builder(生成器接口)。 在C#中,我们可以定义一个生成器接口,包含创建产品各个部分的方法,如`...

    生成器模式代码示例

    生成器模式是一种设计模式,属于创建型模式,它允许我们分步骤构建复杂对象,而无需提前知道整个对象的完整结构。这种模式的核心在于延迟初始化,它使得我们可以根据需要逐步构建对象,而不是一次性创建所有部分。在...

    23钟设计模式之生成器模式

    生成器模式(Builder Pattern)是一种创造型设计模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建可以创建不同的表示。这种模式可以在以下情况下使用: 1. 当创建复杂对象的算法应该独立于该对象的组成...

    C#视频-面向对象设计模式纵横谈(4):Builder 生成器模式(创建型模式)

    Builder模式是一种创建型设计模式,它提供了一种...在观看“C#视频-面向对象设计模式纵横谈(4):Builder 生成器模式(创建型模式)”的视频教程时,可以深入理解Builder模式的工作原理,学习如何在实际项目中有效应用。

    java生成器模式

    生成器模式(Builder Pattern)是Java设计模式中的创建型模式之一,主要解决复杂对象的构建问题,通过将构造过程逐步分解,使得构造过程与表示分离,使得同样的构建过程可以创建不同的表示。这种模式通常用于创建...

    C#面向对象设计模式纵横谈(4):Builder 生成器模式(创建型模式) (Level 300)

    Builder模式是一种创建型设计模式,它提供了一种创建对象的抽象接口,并允许使用不同的实现来创建复杂的对象。在C#中,Builder模式可以帮助我们在不暴露复杂构造过程的情况下,创建具有多种构建步骤的对象。这种模式...

    Builder(生成器)模式[文].pdf

    Builder模式是一种设计模式,主要目的是将复杂对象的构建与其表示分离,使得构建过程可以独立于表示进行。在Builder模式中,我们通常会定义一个抽象Builder类,它规定了如何创建复杂对象的各个部分,然后创建具体...

    C++ Builder 5高级编程技术——GUI编程

    2. **RAD(Rapid Application Development)**:C++ Builder 5支持快速应用开发,通过拖放组件到表单,然后编写事件处理代码,开发者可以快速构建用户界面。这种直观的方式节省了大量编码时间。 3. **组件...

    生成器模式源代码

    生成器模式,也被称为构建器模式,是一种软件设计模式,主要用在对象的创建过程中,它将复杂的构建过程分解为一系列简单的步骤,使得构建过程可配置,并且可以独立于对象的表示进行。在C#中,生成器模式的实现通常...

    C++ Builder 5高级编程技术——IDE与OOP编程

    C++ Builder 5是一款强大的集成开发环境(IDE),专为C++编程设计,它结合了 Borland 的编译器技术和Visual Component Library (VCL)框架,使得对象导向编程(OOP)在Windows平台上更加高效。本篇文章将深入探讨C++ ...

    创建型——Builder模式

    Builder模式是一种创建型设计模式,它提供了一种创建对象的灵活方式,将对象的构建过程与表示分离。这种模式在复杂对象的构造过程中特别有用,因为它允许我们通过不同的步骤来构造对象,而不会让客户端代码受到这些...

    iOS 生成器模式demo

    在iOS开发中,生成器模式(Builder Pattern)是一种设计模式,它允许我们分步骤构建复杂的对象,而无需暴露创建过程的复杂性。这种模式在处理需要多种构建方式或需要逐步构造对象的情况时特别有用。标题“iOS 生成器...

    生成器模式

    2. **具体产品(Concrete Product)**:实现了产品接口,是生成器模式所创建的具体对象。 3. **建造者接口(Builder)**:定义了创建产品对象的各个步骤,并返回最终的构造结果。它通常包含一组用于构建产品的抽象...

Global site tag (gtag.js) - Google Analytics