设计模式-建造者模式(Builder)
简介:
将一个复杂的对象的构建与它的表示分离,使得同样的构建过程创建出不同的表示。
结构图:

优点:
- 使得创建代码和表示代码分离,建造者隐藏了该产品是如何组装的,所以若需要改变一个产品内部的表示,只需要再定义一个具体的建造者就可以了;
- 便于控制细节风险。
缺点:
- 产品必须有共同点,范围有限制;
- 若内部变化复杂,会有很多建造者类。
应用场景:
- 主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但内部的构建通常面临这复杂的变化;
- 当创建复杂对象的算法应该独立于该对象的组成部分以及装配方式时;
- 需要生产的产品对象的属性相互依赖,需要指定其生成顺序时。
注意事项:
与工厂模式相比,更加关注与零配件的装配顺序。
示例:
1.结构类图的实现
Product类,产品类,由多个部件组成
/// <summary>
/// 产品类
/// </summary>
public class Product
{
List<string> parts = new List<string>();
/// <summary>
/// 添加产品部件
/// </summary>
/// <param name="part"></param>
public void AddPart(string part)
{
parts.Add(part);
}
/// <summary>
/// 列举所有产品部件
/// </summary>
public void Show()
{
Console.WriteLine("产品创建-----------");
parts.ForEach(x => Console.WriteLine(x));
}
}
Builder类,抽象建造者类,确定产品是由两个部件PartA和PartB组成,并声明一个得到产品建造后的结果的方法GetResult()
/// <summary>
/// 抽象建造者类
/// </summary>
public abstract class Builder
{
/// <summary>
/// 部件A
/// </summary>
public abstract void BuildPartA();
/// <summary>
/// 部件B
/// </summary>
public abstract void BuildPartB();
/// <summary>
/// 获取产品
/// </summary>
/// <returns>具体产品</returns>
public abstract Product GetResult();
}
ConcreteBuilder类,具体的建造者类
public class ConcreteBuilder1 : Builder
{
private Product product = new Product();
public override void BuildPartA()
{
product.AddPart("部件A");
} public override void BuildPartB()
{
product.AddPart("部件B");
} public override Product GetResult()
{
return product;
}
} public class ConcreteBuilder2 : Builder
{
private Product product = new Product();
public override void BuildPartA()
{
product.AddPart("部件X");
} public override void BuildPartB()
{
product.AddPart("部件Y");
} public override Product GetResult()
{
return product;
}
}
Director类,指挥者类,规范产品部件生成的顺序
/// <summary>
/// 指挥者类
/// </summary>
public class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
客户端
Director director = new Director();
ConcreteBuilder1 builder1 = new ConcreteBuilder1();
director.Construct(builder1);
Product p1 = builder1.GetResult();
p1.Show(); ConcreteBuilder2 builder2 = new ConcreteBuilder2();
director.Construct(builder2);
Product p2 = builder2.GetResult();
p2.Show();
结果

2.建造者模式之西安美食
去西安必须要吃的就是凉皮,肉夹馍,羊肉泡馍...,这些美食会以套餐的形成展示给我们,不同的套餐就是【Product】,一道道美食就是组成【Product】的部件;不同的组合方式就是【Builder】,厨师【Director】将他们搭配起来。
套餐
/// <summary>
/// 套餐
/// </summary>
public class Meal
{
List<string> parts = new List<string>();
public void AddPart(string part)
{
parts.Add(part);
} public void Show()
{
Console.WriteLine("您的套餐齐了:");
parts.ForEach(x => Console.Write(x + " "));
Console.WriteLine("\n**************");
}
}
套餐创建的抽象类
/// <summary>
/// 创建套餐
/// </summary>
public abstract class BuildMeal
{
protected Meal meal = new Meal();
public abstract void BuildePartA();
public abstract void BuildePartB();
public abstract void BuildePartC();
public Meal GetMeal()
{
return meal;
}
}
具体套餐的创建
/// <summary>
/// 经典套餐
/// </summary>
public class BuildClassicalMeal : BuildMeal
{
public override void BuildePartA()
{
meal.AddPart("肉夹馍");
} public override void BuildePartB()
{
meal.AddPart("凉皮");
} public override void BuildePartC()
{
meal.AddPart("冰峰");
}
}
/// <summary>
/// 豪华套餐
/// </summary>
public class BuildLuxuriousMeal : BuildMeal
{
public override void BuildePartA()
{
meal.AddPart("羊肉泡馍");
} public override void BuildePartB()
{
meal.AddPart("糖蒜");
} public override void BuildePartC()
{
meal.AddPart("黑米粥");
}
}
厨师装配
/// <summary>
/// 厨师
/// </summary>
public class Chef
{
/// <summary>
/// 生成套餐的过程
/// </summary>
/// <param name="buildMeal"></param>
public void GiveMeal(BuildMeal buildMeal)
{
buildMeal.BuildePartA();
buildMeal.BuildePartB();
buildMeal.BuildePartC();
}
}
客户端
Chef chef = new Chef();
BuildClassicalMeal buildClassical = new BuildClassicalMeal();
chef.GiveMeal(buildClassical);
Meal classicalMeal = buildClassical.GetMeal();
classicalMeal.Show(); BuildLuxuriousMeal buildLuxurious = new BuildLuxuriousMeal();
chef.GiveMeal(buildLuxurious);
Meal luxuriousMeal = buildLuxurious.GetMeal();
luxuriousMeal.Show();
结果

请 多多指教~(看过记得到西安去品尝哟)
设计模式-建造者模式(Builder)的更多相关文章
- 设计模式—建造者模式(Builder)
title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...
- 23种设计模式--建造者模式-Builder Pattern
一.建造模式的介绍 建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...
- 设计模式--建造者模式Builder(创建型)
一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...
- 说说设计模式~建造者模式(Builder)
返回目录 建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我 ...
- 大话设计模式--建造者模式 Builder -- C++实现实例
1. 建造者模式,将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了. 关键类Directo ...
- 设计模式:建造者模式(Builder)
流水作业大家应该都清楚吧!在流水作业中,我们可以将一些复杂的东西给构建出来,例如汽车.我们都知道汽车内部构件比较复杂,由很多部件组成,例如车轮.车门.发动机.方向盘等等,对于我们用户来说我们并不需要知 ...
- 设计模式 - 建造者模式 Builder Pattern
简介 场景 在创建复杂对象时,用户无须关心该对象所包含的属性以及它们的组装方式,只需要指定复杂对象的类型和内容就可以构建它们. 模式定义 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程 ...
- [工作中的设计模式]建造者模式builder
一.模式解析 建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心. 以上是对建造者模式的官方定义,简单说就是对于复杂对象 ...
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
随机推荐
- 排查MongoDB CPU使用率高的问题
1.公司业务调整,把一部分数据由Redis转至MongoDB,业务在测试环境正常,生产环境上线后发现压力一上来MongoDB的服务直接把CPU占满了,和开发的同学分析了一下也参考了一下百度上类似的问题 ...
- ipset和iptables配合来自动封闭和解封有问题的IP
iptables封掉少量ip处理是没什么问题的,但是当有大量ip攻击的时候性能就跟不上了,iptables是O(N)的性能.而ipset就像一个集合,把需要封闭的ip地址放入这个集合中,ipset 是 ...
- 样式布局与 BFC
一.几类视图 内联视图:inline 单行 块级视图:block 换行,有高度 行内块级视图:inline-block 单行,有高度 二.几类布局 块级布局 换行,通过设置 margin 水平居中 & ...
- mysql数据库备份_可执行文件
这段时间接手运维的工作,刚开始就尝到了数据丢失的痛!老板抱怨,同事抱怨!都说先删库再跑路,我还不想跑! 下面是我的备份记录:(分4步) 1.编写备份执行文件sqlAutoBak.sh #!/bin/s ...
- SharePoint 更改管理帐户密码步骤
// https://wenku.baidu.com/view/0fffab761ed9ad51f01df2df.html \
- php-cgi占用太多cpu资源而导致服务器响应过慢
服务器环境:redhat linux 5.5 , nginx , phpfastcgi 在此环境下,一般php-cgi运行是非常稳定的,但也遇到过php-cgi占用太多cpu资源而导致服务器响应过慢 ...
- 一个自己研究出来的字符串匹配算法-k子串算法
前言 最近工作中需要写一个算法,而写完这个算法我却发现了一个很有意思的事情.需要的这个算法是这样的:对于A,B两个字符串,找出最多K个公共子串,使得这K个子串长度和最大.百度之没有这样的算法,然后就开 ...
- 两行 CSS 代码实现图片任意颜色赋色技术
很久之前在张鑫旭大大的博客看到过一篇 PNG格式小图标的CSS任意颜色赋色技术,当时惊为天人,感慨还可以这样玩,私底下也曾多次想过有没有其他方法可以实现,又或者不仅仅局限于 PNG 图片. mix-b ...
- LeetCode724. 寻找数组的中心索引
1.题目描述 给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和. 如果数组不存在中 ...
- [Swift]LeetCode104. 二叉树的最大深度 | Maximum Depth of Binary Tree
Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...