引言

上一篇介绍了设计模式中的抽象工厂模式-C#设计模式(3)-抽象工厂模式,本篇将介绍建造者模式

点击这里查看全部设计模式系列文章导航

建造者模式简介

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

在软件系统中,有时候会面临着“一个复杂对象”的创建工作,其通常由各个部分子对象用一定的算法构成;由于需求的变化,这个复杂的对象的各个部分可能面临着剧烈的变化,但是把他们组合在一起的算法很稳定。提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求的改变而改变。

实例场景

对于软件公司来讲,公司有研发人员和非研发人员(包括行政人员、管理人员等),每次入职新人,公司的IT人员就需要给新员工配一台电脑,但不同员工需要不同的配置的电脑,研发人员需要配置较高一点的电脑,行政人员需要的配置要求就没那么高;当然需要的配置可能很多,如安装公司用来游戏比赛时用的电脑、UE工程师使用的电脑、做视频用等等需要的配置可能都一样;这里我们仅以研发用电脑、办公用电脑为例;

但无论配置高低都需要给入职人员配置一台新电脑;下面我们用该场景讲解一下建造者模式;

实例代码

类图

建造者

建造者抽象类,这里讲安装电脑的过程标准化

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace BuilderPattern
{
/// <summary>
/// 抽象安装电脑过程
/// </summary>
public abstract class ComputerBuilder
{
/// <summary>
/// 安装内存条
/// </summary>
public abstract void SetupMemory();
/// <summary>
/// 安装硬盘
/// </summary>
public abstract void SetupHarddisk();
/// <summary>
/// 安装操作系统
/// </summary>
public abstract void SetupOperatingSystem(); //安装电脑还需要其它很多步骤,如安装CPU、主板等等,这里不全部列举 }
}

如果安装研发人员使用的电脑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace BuilderPattern
{
/// <summary>
/// 安装研发人员使用电脑
/// </summary>
public class DevelopmentComputerBuilder:ComputerBuilder
{
/// <summary>
/// 安装内存
/// </summary>
public override void SetupMemory()
{
Console.WriteLine("安装一个12G内存条(开发机内存需要配置大一点)");
}
/// <summary>
/// 安装硬盘
/// </summary>
public override void SetupHarddisk()
{
Console.WriteLine("安装一个1T硬盘");
}
/// <summary>
/// 安装操作系统
/// </summary>
public override void SetupOperatingSystem()
{
Console.WriteLine("安装WIN7系统(开发机需要安装各种开发工具,win7系统较稳定)");
}
}
}

如果安装普通办公使用的电脑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace BuilderPattern
{
/// <summary>
/// 安装普通办公电脑
/// </summary>
public class OfficeComputerBuilder:ComputerBuilder
{
/// <summary>
/// 安装内存
/// </summary>
public override void SetupMemory()
{
Console.WriteLine("安装一个4G内存条");
}
/// <summary>
/// 安装硬盘
/// </summary>
public override void SetupHarddisk()
{
Console.WriteLine("安装500G硬盘");
}
/// <summary>
/// 安装操作系统
/// </summary>
public override void SetupOperatingSystem()
{
Console.WriteLine("安装WIN10系统");
}
}
}

当然需要的配置可能很多,如安装公司用来游戏比赛时用的电脑、UE工程师使用的电脑、做视频用等等需要的配置可能都一样;这里不一 一列举;

指挥者

指挥者类的目的就是根据使用人需求的不同来安装电脑,而使用人或者用户不需要知道安装的过程,而这里面的每一个步骤都是必须的;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace BuilderPattern
{
class ComputerDirector
{
public void ConstructComputer(ComputerBuilder builder)
{
//安装内存条
builder.SetupMemory();
//安装硬盘
builder.SetupHarddisk();
//安装操作系统
builder.SetupOperatingSystem();
}
}
}

业务调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace BuilderPattern
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("----------------开始安装电脑-------------------------------------");
//研发人员使用电脑安装 建造者
ComputerBuilder builder = new DevelopmentComputerBuilder();
//普通办公使用电脑安装 建造者
//ComputerBuilder builder = new OfficeComputerBuilder();
ComputerDirector director = new ComputerDirector();
director.ConstructComputer(builder);
Console.WriteLine("----------------安装完成--------------------------------");
Console.ReadKey();
}
}
}

如果安装研发使用电脑,运行结果如下

如果安装普通办公使用电脑,运行结果如下

建造者模式结构图

本文实例中:

Builder就是安装电脑的抽象类 ;

ConstructBuilder为具体的建造者,就是上述的办公用电脑安装、研发用电脑安装;均具体实现了电脑安装抽象类;

Product产品就是具体的电脑;

Derictor,指挥者,上述示例即根据用户具体的需求安装不同配置的电脑;

总结

适用场景

1、需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。 
 2、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式。

优缺点

优点:

    建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。

将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,使得我们能够更加精确的控制复杂对象的产生过程。

每一个Builder都相对独立,而与其它的Builder无关(一个产品有一个Builder相对应),可以很方便的增加或替换建造者。

缺点:

建造者的缺点在与如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,这样这个模式就不适用。

C#设计模式(5)-建造者模式的更多相关文章

  1. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  2. C#设计模式(5)——建造者模式(Builder Pattern)

    一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...

  3. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  4. C++设计模式之建造者模式(三)

    4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...

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

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

  6. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  7. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  8. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  9. GOF23设计模式之建造者模式

    GOF23设计模式之建造者模式 场景: 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样的一个问题需要处理: 装配这些子组件是不是有个步骤问题? 实际开发中,我们所 ...

  10. java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

随机推荐

  1. LigerUI LigerGrid getSelectedRows() 多选顺序 不是从上到下修改方法

    1.问题 LigreGrid内部是选中一个,往selected里塞一个, 当执行getSelectedRows() 的时候,会把selected以选中的顺序,返回出来,所以是按照选择顺序返回. 原生代 ...

  2. JavaScript字符串处理

    字符串处理 1.连接字符串: 1)连接符+: 2)连接赋值+=: 3)连接函concat() 2.查找子串位置indexOf() 1)在指定字符串中是否存在给定的字符串(第一次出现) 2)用法str. ...

  3. 勤快的love枫[ZJOI2007]

    题目描述 小绝恋love 枫是一个出纳,经常需要做一些统计报表的工作.今天是绝恋love 枫的生日,小绝恋love 枫希望可以帮爸爸分担一些工作,作为他的生日礼物之一.经过仔细观察,小绝恋love 枫 ...

  4. Git时光机穿梭之撤销修改

    自然,你是不会犯错的.你在readme.txt中添加了一行: $ cat readme.txt Git is a distributed version control system. Git is ...

  5. web端常见安全漏洞测试结果分析-- appscan

    基于appscan测试结果分析: 一.XSS跨站脚本 指的是攻击者往Web页面里插入恶意html代码,通常是JavaScript编写的恶意代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被 ...

  6. PAT (Basic Level) Practise (中文) 1023. 组个最小数 (20)

    1023. 组个最小数 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定数字0-9各若干个.你可以以 ...

  7. Jenkins安装与配置

    Jenkins安装与配置 2 Jenkins安装 在最简单的情况下,Jenkins 只需要两个步骤: 1.下载最新的版本(一个 WAR 文件).Jenkins官方网址: http://Jenkins- ...

  8. 谈一谈 Laravel 5.5 的 「自动发现」和此刻心情

    看了Taylor Otwell发表的Package Auto-Discovery In Laravel 5.5第一反应是 为啥... 也怪我,在开发之前忘记看5.5的开发代码动态,之前的文章中也提到过 ...

  9. 剑指offer——矩阵覆盖(斐波那契变形)

    ****感觉都可以针对斐波那契写一个变形题目的集合了****** 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? cl ...

  10. Big Endian与Litter Endian

    Big Endian是大端,Litter Endian是小端,意思很明了,但是很难记住谁是谁.每次涉及到这个概念的时候,我都会GOOGLE一下,浪费精力. 怎样才能永远记住他们呢?网上搜索了一下,有很 ...