Net设计模式实例之建造者模式(Builder Pattern)
一、建造者模式简介(Brief Introduction)
建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。
建造者模式的优点是:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
二、解决的问题(What To Solve)
主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。
三、建造者模式分析(Analysis)
1、建造者模式结构
Product类:具体的产品。
Director类:指挥者,构建一个使用Builder接口的对象。
Builder接口:是为创建一个Product对象的各个组件指定的抽象接口
ConcreteBuilder类:具体的建造者,实现Builder接口,构造和装配各个部
2、源代码
1、具体产品Product |
public class Product { private IList<string> parts = new List<string>(); public void Add(string part) { parts.Add(part); } public void Show() { Console.WriteLine("产品开始创建......"); foreach (string part in parts) { Console.WriteLine("部件" + part); } Console.WriteLine("产品完成创建"); } } |
2、抽象建造者Builder及其具体建造者ConcreteBuilder1,ConcreteBuilder2 |
public abstract class Builder { public abstract void BuildPartA(); public abstract void BuildPartB(); public abstract Product GetResult(); } public class ConcreteBuilder1 : Builder { Product product = new Product(); public override void BuildPartA() { product.Add("A1"); } public override void BuildPartB() { product.Add("B1"); } public override Product GetResult() { return product; } } public class ConcreteBuilder2 : Builder { Product product = new Product(); public override void BuildPartA() { product.Add("A2"); } public override void BuildPartB() { product.Add("B2"); } public override Product GetResult() { return product; } } |
3、指挥者类Director |
/// <summary> /// 指挥建造过程 /// </summary> public class Director { public void Construct(Builder builder) { builder.BuildPartA(); builder.BuildPartB(); } StringBuilder } |
4、客户端代码 |
static void Main(string[] args) { Director director = new Director(); Builder builder1 = new ConcreteBuilder1(); Builder builder2 = new ConcreteBuilder2(); director.Construct(builder1); Product product1 = builder1.GetResult(); product1.Show(); director.Construct(builder2); Product product2 = builder2.GetResult(); product2.Show(); Console.Read(); } |
3、程序运行结果
四.案例分析(Example)
1、场景
假设房子只有房顶和墙(Roof And Walls)
Jane和 Joe两个客户需要从建造商Bob那里买房子。Jane需要1个房顶(Roof)和4面墙(Walls)的房子,Joe需要1个房顶(Roof)和7面墙(Walls)的房子。建造商需要通过建造者模式实现客户的个性要求。
此时建造商Bob(Contractor)就是指挥者(Director),TownHomeSubContractor和SingleFamilySubContractor就是建造者类(Builder Class),房子就是产品(House is Product).如下图所示
House类:House is Pruduct
Contractor类,指挥者
MakeHouse()方法,指挥房子建造过程。
ISubConstractor接口,建造者接口,
AddRoof().添加房顶方法
AddWalls(),添加墙的方法
GetHouse(),获得构建好的房子方法。
TownHomeSubContractor类,具体的建造者,实现建造者接口方法。
建造一个房顶和四面墙,以满足Jane 的要求。
SingleFamilySubContractor类,具体的建造者,实现建造者接口方法。
建造一个房顶和七面墙,以满足Joe的要求。
2、代码
1、产品House |
public class House { public string Roof { get; set; } public string Walls { get; set; } } |
2、指挥者类Contractor |
public class Contractor { public void MakeHouse(ISubContractor contractor) { contractor.AddRoof(); contractor.AddWalls(); } } |
3、抽象建造者ISubContractor及其具体建造者TownHomeSubContractor,SingleFamilySubContractor |
//Sub Contractor interface (IBuilder) public interface ISubContractor { void AddRoof(); void AddWalls(); House GetHouse(); } //Concrete Builder Classes public class TownHomeSubContractor : ISubContractor { private House _house = new House(); public void AddRoof() { _house.Roof = "Adding a small roof"; } public void AddWalls() { _house.Walls = "Adding 4 Walls"; } public House GetHouse() { return _house; } } public class SingleFamilySubContractor : ISubContractor { private House _house = new House(); public void AddRoof() { _house.Roof = "Adding a large roof"; } public void AddWalls() { _house.Walls = "Adding 7 Walls"; } public House GetHouse() { return _house; } } |
4、客户端代码 |
static void Main(string[] args) { //Jane wants a Town Home Console.WriteLine("Building a Town Home for Jane.."); Contractor contractor = new Contractor(); ISubContractor subContractorTownHome = newTownHomeSubContractor(); contractor.MakeHouse(subContractorTownHome); House townHome = subContractorTownHome.GetHouse(); Console.WriteLine(townHome.Roof + ".."); Console.WriteLine(townHome.Walls + ".."); //Joe wants a Single Family Home Console.WriteLine("\nBuilding a Town Home for Joe.."); ISubContractor subContractorSingleFamily = newSingleFamilySubContractor(); contractor.MakeHouse(subContractorSingleFamily); House singleFamilyHouse = subContractorSingleFamily.GetHouse(); Console.WriteLine(singleFamilyHouse.Roof + ".."); Console.WriteLine(singleFamilyHouse.Walls + ".."); } |
3、程序运行结果
五、总结(Summary)
建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。
转载自:http://www.cnblogs.com/ywqu/archive/2010/01/11/1643753.html
Net设计模式实例之建造者模式(Builder Pattern)的更多相关文章
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- 建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...
- 设计模式-05建造者模式(Builder Pattern)
1.模式动机 比如我们要组装一台电脑,都知道电脑是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘和鼠标组成,其中非常重要的一点就是这些硬件都是可以灵活选择,但是组装步骤都是大同小异(可以组一个 ...
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
随机推荐
- jvm的内存分配总结
最近看了周志明版本的<深入理解Java虚拟机>第一版和第二版,写的很好,收获很多,此处总结一下. jvm中内存划分: 如上图,一共分为五块,其中: 线程共享区域为: 1.java堆 ...
- PYTHON之全局变量
应该尽量避免使用全局变量.不同的模块都可以自由的访问全局变量,可能会导致全局变量的不可预知性.对全局变量,如果程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能导致程序中的错误.这种错误是很难 ...
- WiFi流量劫持—— JS脚本缓存投毒
在上一篇<WiFi流量劫持—— 浏览任意页面即可中毒>构思了一个时光机原型,让我们的脚本通过HTTP缓存机制,在未来的某个时刻被执行,因此我们可以实现超大范围的入侵了. 基于此原理,我们用 ...
- 【直播】APP全量混淆和瘦身技术揭秘
[直播]APP全量混淆和瘦身技术揭秘 近些年来移动APP数量呈现爆炸式的增长,黑产也从原来的PC端转移到了移动端,通过逆向手段造成数据泄漏.源码被盗.APP被山寨.破解后注入病毒或广告现象让用户苦不堪 ...
- C#设计模式之组合
IronMan之组合 在上个篇幅中讲到怎么把“武器”装饰到“部件”上,这个篇幅呢,还是要讲到“武器”,不过呢是关于“武器”使用的. 本篇介绍"武器"的合理使用方式,不说废话,直接来 ...
- 可扩容分布式session方案
分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器i ...
- 一个不错的vue表单验证插件
github文档 用着不错,官方的文档例子很简单 <body> <div id="app"> <validator name="valida ...
- java中对final关键字的理解以及使用场景
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.
- Linux Hadoop2.7.3 安装(单机模式) 二
Linux Hadoop2.7.3 安装(单机模式) 一 Linux Hadoop2.7.3 安装(单机模式) 二 YARN是Hadoop 2.0中的资源管理系统,它的基本设计思想是将MRv1中的Jo ...
- Android笔记——SQLiteOpenHelper类
public 抽象类 SQLiteOpenHelper 继承关系 Java.lang.Object android.database.sqlite.SQLiteOpenHelper 类概要 这是一个辅 ...