建造者模式(Builder)

定义

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

类图

描述

Builder:定义一个建造者抽象类,以规范产品对象的各个组成部分的建造。这个接口规定要实现对象的哪些部分的创建,并不涉及具体的对象部件的创建。

ConcreteBuilder:继承Builder,针对不同的业务逻辑,具体化对象的各部分的创建。在建造过程完成后,提供产品的实例。

Director:调用具体建造者来创建对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

Product:要创建的对象。

建造者模式仅仅只比工厂模式多了一个"Director类"的角色。

应用场景

以生产轿车为例,建造者负责生产汽车的各个部件,而指挥者负责指挥建造者按流程组装轿车。

    /// <summary>
/// 发动机
/// </summary>
public class Engine
{
public string Description { get; set; }
} /// <summary>
/// 车体结构
/// </summary>
public class Body
{
public string Description { get; set; }
} /// <summary>
/// 车轮
/// </summary>
public class Wheel
{
public string Description { get; set; }
} /// <summary>
/// 汽车
/// </summary>
public class Car
{
public Body body { get; set; }
public Engine engine { get; set; }
public Wheel wheel { get; set; }
} /// <summary>
/// 建造者接口
/// </summary>
public interface IBuilder
{
void BuildBody();
void BuildEngine();
void BuildWheel();
Car CreateCar();
} /// <summary>
/// 奥迪建造者
/// </summary>
public class BuilderAudi : IBuilder
{
private Car car = new Car(); public void BuildBody()
{
car.body = new Body() { Description = "奥迪的车身结构." };
Console.WriteLine(string.Format("安装{0}", car.body.Description));
} public void BuildEngine()
{
car.engine = new Engine() { Description = "奥迪的发动机." };
Console.WriteLine(string.Format("安装{0}", car.engine.Description));
} public void BuildWheel()
{
car.wheel = new Wheel() { Description = "奥迪的车轮." };
Console.WriteLine(string.Format("安装{0}", car.wheel.Description));
} public Car CreateCar()
{
Console.WriteLine("奥迪车安装完成.");
return car;
}
} /// <summary>
/// 奔驰建造者
/// </summary>
public class BuilderBenz : IBuilder
{
private Car car = new Car(); public void BuildBody()
{
car.body = new Body() { Description = "奔驰的车身结构." };
Console.WriteLine(string.Format("安装{0}", car.body.Description));
} public void BuildEngine()
{
car.engine = new Engine() { Description = "奔驰的发动机." };
Console.WriteLine(string.Format("安装{0}", car.engine.Description));
} public void BuildWheel()
{
car.wheel = new Wheel() { Description = "奔驰的车轮." };
Console.WriteLine(string.Format("安装{0}", car.wheel.Description));
} public Car CreateCar()
{
Console.WriteLine("奔驰车安装完成.");
return car;
}
} /// <summary>
/// 指挥者
/// </summary>
public class Director
{
public void Constrcut(IBuilder builder)
{
builder.BuildBody();
builder.BuildEngine();
builder.BuildWheel();
}
}

设计模式之笔记--建造者模式(Builder)的更多相关文章

  1. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  2. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  3. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  4. IOS设计模式浅析之建造者模式(Builder)

    定义 "将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现". 最初的定义出现于<设计模式>(Addison-Wesley,1994). 看这个概 ...

  5. Net设计模式实例之建造者模式(Builder Pattern)

    一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...

  6. C# 设计模式巩固笔记 - 建造者模式

    前言 写给自己-贵在坚持.建造者模式不复杂,但是想个形象的例子好难. 介绍-建造者模式 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 实现 建造者模式主要是应对复杂 ...

  7. 学习笔记——建造者模式Builder

    构造者模式.外部场景如果需要一个汽车类,它不需要关心如何构造,它只需要告诉Director需要什么,就可以从Director获得. 如:CDirector(IBuilder* aBuilder); 场 ...

  8. Java-马士兵设计模式学习笔记-建造者模式

    一.概述 二.代码 1.Animal.java public interface Animal { public void bark(); } 2.Dog.java public class Dog ...

  9. 设计模式学习之建造者模式(Builder,创建型模式)(6)

    假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...

随机推荐

  1. 转:learning to rank学习

    learning to rank学习 转: http://blog.csdn.net/xuqianghit/article/details/8947819 1. 什么是learning to rank ...

  2. BZOJ1878:[SDOI2009]HH的项链——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1878 题面源于洛谷 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的 ...

  3. [Leetcode] search in rotated sorted array ii 搜索旋转有序数组

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  4. [Leetcode] Binary tree postorder traversal二叉树后序遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  5. bzoj2083: [Poi2010]Intelligence test(二分+vector)

    只是记录一下vector的用法 v.push_back(x)加入x v.pop_back()弹出最后一个元素 v[x]=v.back(),v.pop_back()删除x,但是会打乱vector顺序 v ...

  6. VS 2013 with update安装失败(kb2829760)解决方案

    update过程中遇到kb2829760补丁无法更新而导致vs安装失败的解决方法: 1.安装KB2829760: 2.安装KB2829760中文语言包: 3.安装VS2013 with update. ...

  7. A great tutorial with Jupyter notebook for ML beginners

    An end to end implementation of a Machine Learning pipeline SPANDAN MADAN Visual Computing Group, Ha ...

  8. SPOJ - HIGH :Highways (生成树计数)

    Highways 题目链接:https://vjudge.net/problem/SPOJ-HIGH Description: In some countries building highways ...

  9. iOS通知传值

    NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"loginName"] = @&q ...

  10. bzoj3671 [Noi2014]随机数生成器

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3671 [题解] 贪心从1...n*m取,开两个5000*5000的数组就够了,可以重复利用, ...