23种设计模型:Builder(生成器) —— 对象创建型模式

builder模式主要应对复杂对象的各个部分频发变化。缺点在于难以应对构建算法的变化。在builder模式中,要注意不同语言中构造器调用虚函数的差别。

一、意图

将一个复杂对象的构建与它的表示分离(抽象),使得同样的构建过程(稳定)可以创建不同的表示(变化)。(GOF)

二、动机

在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法(稳定)构成,由于需求的变化,这个复杂的对象的各个部分面临着剧烈变化,但是将它们组合到一起的算法却相对稳定

三、适用性

  • 创建复杂对象算法(过程)应该独立于该对象的组成部分(成员函数、成员变量等)时以及它们的装配方式(调用)时。

  • 当构造过程必须允许被构造的对象有不同的表示(组成部分不同)时。

四、效果

  • 可以改变一个产品的内部表示(修改一个对象内部的变量或者方法)
  • 将构造代码和表示代码分开。
  • 可以对构造过程进行更精细的控制

五、结构

结构图

六、参与者、

  • Builder:

-为创建一个Product对象的各个部件指定抽象接口。

  • ConcreteBuilder:

-实现Builder的接口以构造和装配该产品的各个部件。

-定义并明确它所创建的表示。

-提供一个检索产品的接口。

  • Dirctor:

-构造一个使用builder接口的对象。

  • Product:

-表示被构造的复杂对象。ConcreteBuilder创建该对象的内部表示并定义它的装配过程。

-包含定义组成部件的类。包括将这些部件装配成最终产品的接口。

七、代码示例

我们举一个盖房子的例子,假设盖一个房子需要地板(floor)、墙(wall)、窗户(window)和屋顶(roof)。

using System;

namespace Builder
{
    class Client
    {
        static void Main(string[] args)
        {
            House house;//Product

            Dirctor dirctor = new Dirctor();
            GoldHouse goldHouse = new GoldHouse();//这一步也可以写道Director里面去
            dirctor.Constrcut(goldHouse);
            house = goldHouse.GetHouse();

            house.Show();
            Console.ReadLine();
        }
    }
}

 Builder抽象类,定义构造House(Product)的接口和“GetResult”。

using System;
using System.Collections.Generic;
using System.Text;

namespace Builder
{
    abstract class HouseBuilder
    {
        abstract public House BuildHouse();
        abstract public void BuildRoof();
        abstract public void BuildWindow();
        abstract public void BuildFloor();
        abstract public void BuildWall();

        abstract public House GetHouse();
    }
}

⬇⬇⬇⬇  定义House(Product)。⬇⬇⬇⬇

using System;
using System.Collections.Generic;
using System.Text;

namespace Builder
{
    class House
    {
        public string RoorMateria = null;
        public string WindowMateria = null;
        public string WallMateria = null;
        public string FloorMateria = null;

        public void Show()
        {
            Console.WriteLine(RoorMateria);
            Console.WriteLine(WindowMateria);
            Console.WriteLine(WallMateria);
            Console.WriteLine(FloorMateria);
        }
    }
}

GoldHouse(ConcreteBuilder),实现接口,构造house,然后返回house实例。

using System;
using System.Collections.Generic;
using System.Text;

namespace Builder
{
    /// <summary>
    /// ConcreteBuilder
    /// </summary>
    class GoldHouse : HouseBuilder
    {
        private House newHouse;

        public override House BuildHouse()
        {
            newHouse = new House();
            return newHouse;
        }
        public override void BuildFloor()
        {
            newHouse.FloorMateria = "金地板";
        }

        public override void BuildRoof()
        {
            newHouse.RoorMateria = "金屋顶";
        }

        public override void BuildWall()
        {
            newHouse.WallMateria = "金墙";
        }

        public override void BuildWindow()
        {
            newHouse.WindowMateria = "金窗户";
        }

        public override House GetHouse()
        {
            return newHouse;
        }
    }
}

Director,以“同样的构建过程”构建house。

using System;
using System.Collections.Generic;
using System.Text;

namespace Builder
{
    class Dirctor
    {
        public void Constrcut(HouseBuilder houseBuilder)
        {
            houseBuilder.BuildHouse();
            houseBuilder.BuildFloor();
            houseBuilder.BuildRoof();
            houseBuilder.BuildWall();
            houseBuilder.BuildWindow();
        }
    }
}

总结:builder模式,适用于创建一个对象的流程是固定的,但是每一步的内容会有变化,然后我们抽象出一个基类(Builder)包含创建对象的过程(part1,part2...和getResult返回构建的对象),ContreteBuilder具体实现,Dirctor就是创建对象具体过程,第一步执行哪个,第二部执行哪个...,具体实现大同小异。

这是最开始的版本,有Director。如果只有一个Concretebuilder,可以省略Director、和Builder。

学习笔记,仅供参考。走火入魔,概不负责。如有错误,谢谢指出。(^_^)

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值