设计模式(C#)——03建造者模式
推荐阅读:
当一个复杂对象由一些子对象构成,并且子对象的变化会导致复杂对象的修改。这时我们需要提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化,从而保持系统中的"稳定构建算法"不随需求的改变而改变,这就是今天要给大家分享的建造者模式。
建造者模式(Builder Pattern)
建造者模式属于创建型模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式要素:
1、抽象建造者(Builder):给出一个抽象结论,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的对象部件的创建;
2、具体建造者(Concrete Builder):实现建造者接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。在构造过程完成后,提供产品的实例;
3、指导者(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建;
4、产品类(Product):需要创建的具体的复杂对象。
下面举个例子来为大家讲解一下吧。
命名空间建造者模式中包含Phone手机类充当产品类,Builder基类为抽象建造者,华为HF类、小米XM类、魅族MZ类。另外包含1个手机扩展类和1个指导者。本示例向大家演示3个不同的手机厂商在生产比较复杂的汽车时所采用的策略。
理清了这个逻辑过程之后,下面就具体看下如何用代码来表示这种现实生活中的逻辑过程:
1.创建抽象建造者Builder
public abstract class Builder {
protected phone = new Phone();//手机
public abstract void BuildCPU();//CPU
public abstract void BuildBattery();//电池
public abstract void BuildSpeaker();//扬声器
public abstract void BuildColor();//颜色
public virtual Phone GetPhone() {
return phone;
}
}
2.具体建造者(CPU,Battery,Speaker,Color)
public class HW : Builder {
public override void BuildCPU() {
phone.Carframe = "华为的处理器";
}
public override void BuildBattery() {
phone.Battery = 3000;
}
public override void BuildSpeaker() {
phone.Speaker= "华为的扬声器";
}
public override void BuildColor() {
phone.Color= "华为的专属颜色";
}
}
public class XM : Builder {
public override void BuildCPU() {
phone.Carframe = "小米的处理器";
}
public override void BuildBattery() {
phone.Battery = 3500;
}
public override void BuildSpeaker() {
phone.Speaker= "小米的扬声器";
}
public override void BuildColor() {
phone.Color= "小米的专属颜色";
}
}
public class MZ : Builder {
public override void BuildCPU() {
phone.Carframe = "魅族的处理器";
}
public override void BuildBattery() {
phone.Battery = 2500;
}
public override void BuildSpeaker() {
phone.Speaker= "魅族的扬声器";
}
public override void BuildColor() {
phone.Color= "魅族的专属颜色";
}
}
3.指导者Director
public class Director {
public void Construct(Builder builder) {
builder.BuildCPU();
builder.BuildBattery();
builder.BuildSpeaker();
builder.BuildColor();
}
}
4.一个扩展类
public static class Extentions {
public static string VehicleInfo(this Vehicle vehicle) {
var type = vehicle.GetType();
var properties = type.GetProperties();
var result = string.Empty;
foreach (var prop in properties) {
result +=
$"{prop.Name}:{prop.GetValue(vehicle, null)}{Environment.NewLine}";
}
return result;
}
}
5.调用方的代码,分别维持对指导者、建造者和手机的引用,接下来我们创建了3部手机。
public class Program {
private static Director _director = null;
private static List<Builder> _builders = null;
private static Phone _phone = null;
public static void Main(string[] args) {
_director = new Director();
_phone = new Phone ();
_builders = new List<Builder>() {
new HW(),
new XM(),
new MZ()
};
foreach (var builder in _builders) {
_director.Construct(builder);
_phone = builder.GetResult();
_phone .Print();
}
Console.ReadKey();
}
}
上面,我们介绍完了建造者模式的具体实现之后,最后让我们总结下建造模式的实现要点:
1.在建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。
2.。建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的(也就是说电脑的内部组件是经常变化的,这里指的的变化如硬盘的大小变了,CPU由单核变双核等)。
3.产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
4.在前面文章中介绍的抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。
5.由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。
设计模式(C#)——03建造者模式的更多相关文章
- java23种设计模式——五、建造者模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 设计模式学习之建造者模式(Builder,创建型模式)(6)
假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...
- PHP设计模式之:建造者模式
建造者模式: 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式; 目的: 消除其他对象复杂的创建过程 结构图: 优点: 建造者模式可以很好的将一个对象的实现与相关的“业 ...
- java常用设计模式五:建造者模式
1.定义 是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 产品类:一般是一个较为复杂的对象,也就是说创建对象的 ...
- Java设计模式学习记录-建造者模式
前言 今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发企业内部系统的这种传统开发,感觉这 ...
- java设计模式-----6、建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类 ...
- IOS设计模式浅析之建造者模式(Builder)
定义 "将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现". 最初的定义出现于<设计模式>(Addison-Wesley,1994). 看这个概 ...
- Java设计模式14:建造者模式
什么是建造者模式 发现很多框架的源码使用了建造者模式,看了一下觉得挺实用的,就写篇文章学习一下,顺便分享给大家. 建造者模式是什么呢?用一句话概括就是建造者模式的目的是为了分离对象的属性与创建过程,是 ...
随机推荐
- python红蓝英雄大乱斗(面向对象实现)
红蓝英雄大乱斗 游戏规则 ''' 有红蓝两方英雄(可自定义个数) 随机一方英雄使用随机攻击方式攻击另一方英雄,任意一方英雄全部阵亡则游戏结束 每个英雄有 名字.生命值.普通攻击.Q技能攻击.W技能攻击 ...
- Java EE.JSP.指令
JSP的指令是从JSP向Web容器发送消息,它用来设置页面的全局属性,如输出内容类型等. JSP的指令的格式为:<%@ 指令名 属性="属性值"%> 1.page指令 ...
- MVC设计模式与Java Web经典三层架构
MVC设计模式 MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控 ...
- CSDN 免积分下载
你可能不相信这个标题,那么打开下面的链接试试吧 ↓↓↓ Github项目 最新功能 ↓↓↓ 0积分资源搜索 0积分资源搜索(备用地址) CSDN资源导出 CSDN资源下载体验群 (每日可免费下载一次) ...
- 0728 history
-- :: cd /etc/yum.repos.d/ -- :: wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox. ...
- Android利用Handler异步获取子线程中的产生的值
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 近段时间有一个需求:在线获取图片并且显示在界面 ...
- springcloud-eureka
作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权归作者所有,转载请注明出处 Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service ...
- TCP queue 的一些问题
转自Jasey Wang的blog,原文地址 首先回顾下三次握手里面涉及到的问题: 当 client 通过 connect 向 server 发出 SYN 包时,client 会维护一个 socket ...
- 续集:白菜的内涵,更新nand分区为ubifs,替换overlay
在上一篇真千兆路由的极限之OPENWRT MAKE, 某品牌白菜价QCA9558/QCA9880/QCA8337N纯种组合OS搭建时记中附带了128M nand的空间图示,在ar71xx profil ...
- 在vue中监听storage的变化
1.首先在main.js中给Vue.protorype注册一个全局方法,其中,我们约定好了想要监听的sessionStorage的key值为’watchStorage’,然后创建一个StorageEv ...