Builder生成器(创建型模式)
一、使用场景:
1、假设要创建一个House设施,该设施的创建由若干个部分组成,而且这若干个部分经常变化。
如果用最直观的设计方式,每一个房屋部分的变化,都将导致整个房屋结构的重新修正,但是这种设计方式,维护成本太高,而且如果对象极度复杂,那么很容易就会产生问题!
So,Builder Pattern is userd to solve this paogram!
2、意图
讲一个复杂对象的构建与表示相分离,使得同样的构建过程可以创建不同的表示。 ---设计模式《GOF》
3、抽象图
当软件的"主线"
比较稳定,当主线边上的枝枝叶叶变化频繁的话
4、Bulider模式的使用动机
在软件系统中,有时候面临这一个"复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个对象的子对象经常面临这剧烈的变化,但是将它们组合在一起的算法却非常的稳定。
那么如何应对这种变化?如何提供一种"封装机制"来隔离出复杂对象各个部分的变化,从而保证系统中的稳定构建算法不随需求的变化而变化?
5、Buidler模式的使用意图
将一个复杂的对象的构建过程与其表示相分离,使得同样的构建过程可以创建出不同的表示
6、具体案例
需求如下:一个抽象游戏系统,该系统的变化较慢(趋于稳定),该系统需要能构建不同风格的房屋,而且不同风格的房屋的组成部分(如门、窗)等能动态扩展.
代码如下:
/// <summary>
/// Builder生成器模式(创建型模式)
/// </summary>
public class Builder
{ public class BuildSystem
{
public void Build(House house)
{
var houseTypeName = house.GetType().Name;
var houseInsantce=house.CreateHouse(houseTypeName);
}
} #region 抽象 /// <summary>
/// 房屋抽象
/// </summary>
public abstract class House
{
public abstract Window Window { get; set; } public abstract Door Door { get; set; } public abstract House CreateHouse(string builerTypeName);
} /// <summary>
/// 房屋生成器抽象
/// </summary>
public abstract class HouseBuilder
{
/// <summary>
/// 窗户构建方法
/// </summary>
/// <returns></returns>
public abstract void BuildWindow(); /// <summary>
/// 门构建方法
/// </summary>
/// <returns></returns>
public abstract void BuildDoor(); /// <summary>
/// 按照一定的逻辑组装构成部分,返回一个House实例
/// </summary>
/// <returns></returns>
public abstract House GetHouse();
} /// <summary>
/// 房屋构成一窗户抽象
/// </summary>
public abstract class Window { } /// <summary>
/// 房屋构成一门抽象
/// </summary>
public abstract class Door { } #endregion #region 具体实现 public class ModernHouse : House
{
public override Window Window { get; set; } public override Door Door { get; set; } public override House CreateHouse(string builerTypeName)
{
var builderTypeName = ConfigurationManager.AppSettings["ModernHouse"] as string;
//根据配置文件加载当前程序集获取传入风格房屋对应的Buider生成器类,生成对应的风格的房屋
var assembly = Assembly.LoadFile(@"F:\小超-基础框架\ZCBase\Demo\DesignMode\CreateDesginMode\bin\Debug\CreateDesginMode.exe");
var buildType = assembly.GetTypes().FirstOrDefault(f => f.Name.Equals(builderTypeName));
var instance = Activator.CreateInstance(buildType) as HouseBuilder;
var house = instance.GetHouse();
return house;
}
} public class ModernWindow : Window { } public class ModernDoor : Door { } /// <summary>
/// 现代化房屋构建方法
/// </summary>
public class ModernHouseBuilder : HouseBuilder
{
private ModernDoor _moderDoor; private Window _window; public override void BuildDoor()
{
_moderDoor=new ModernDoor();
} public override void BuildWindow()
{
_window = new ModernWindow();
} public override House GetHouse()
{
BuildDoor();
BuildWindow();
var modernHouse = new ModernHouse();
modernHouse.Door = _moderDoor;
modernHouse.Window = _window;
return modernHouse;
} } #endregion
}
配置文件代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="ModernHouse" value="ModernHouseBuilder" />
</appSettings>
</configuration>
客户端调用代码如下:
/// <summary>
/// 创建型设计模式
/// </summary>
class Program
{
static void Main(string[] args)
{
{
//Builder生成器调用客户端
BuildSystem buildSystem = new BuildSystem();
buildSystem.Build(new ModernHouse());
}
Console.ReadKey();
}
}
通过配置文件的方式,动态地配置不同风格的房屋对应的房屋Builder来实现需求,该方法能很好的满足需求,这就是Builder生成器的作用,让一个对象的部分创建过程,创建过程保持一致的同时,能创建出不同的实现.
Builder生成器(创建型模式)的更多相关文章
- 设计模式(二): BUILDER生成器模式 -- 创建型模式
1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...
- 设计模式03: Builder 生成器模式(创建型模式)
Builder生成器模式(创建型模式) Builder模式缘起假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分富于变化.如果使用最直观的设计方法,每个房屋部分的变化,都将 ...
- 设计模式学习之建造者模式(Builder,创建型模式)(6)
假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...
- 【转】设计模式(三)建造者模式Builder(创建型)
(http://blog.csdn.net/hguisu/article/details/7518060) 1. 概述 在软件开发的过程中,当遇到一个"复杂的对象"的创建工作,该对 ...
- 设计模式(三)建造者模式Builder(创建型)
1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...
- 设计模式之建造者模式Builder(创建型)
1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...
- 创建型模式之Builder(建造者)模式
GitHub地址:https://github.com/zhangboqing/design-mode/tree/master/src/main/java/com/zbq 一.定义 建造者模式 ...
- 设计模式之美:Creational Patterns(创建型模式)
创建型模式(Creational Patterns)抽象了对象实例化过程. 它们帮助一个系统独立于如何创建.组合和表示它的那些对象. 一个类创建型模式使用继承改变被实例化的类. 一个对象创建型模式将实 ...
- .NET设计模式(7):创建型模式专题总结(Creational Pattern)(转)
概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独立于如何创建.组合和表示它的那些对象.本文对五种常用创建型模式进行了比较,通过一个游戏开发场景的例子来说该如何使用创建型模 ...
随机推荐
- 多参数同时运行docker
docker run --name=newtomcat7 -t -i -p 5000:5000 -v /root/work/docker:/root/hzbtest 93541fa83230 /bin ...
- ArcGIS根据最大最小坐标换算瓦片行列号
1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法,而知道这个原理后,接下来我们要怎么用它呢?它和我们前端显示地图有什么关联呢?这一节,我会尽量详细的将这两个问题 ...
- Center Alignment
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93359#problem/B(456321) http://codeforces.com/ ...
- 3D UI场景中,把XY平面的尺寸映射为屏幕像素的数学模型推导
概述及目录(版权所有,请勿转载,欢迎读者提出错误) 之前用kanzi的3D UI引擎和cocos-2d的时候都有遇到过这个问题,就如何把3D场景中的XY平面的尺寸映射为与屏幕像素一一对应的,即XY平面 ...
- Andfix热修复技术使用
AndFix,全称是Android hot-fix.是阿里开源的一个Android热补丁框架,允许APP在不重新发版本的情况下修复线上的bug.支持Android 2.3 到 6.0. andfix的 ...
- Pywinauto 基于Win32 程序的自动化功能测试工具
1. 前提条件 ü Python2.6 下载地址:http://ishare.iask.sina.com.cn/f/8173206.html ü Pywinauto-0.4.1 下载地址:htt ...
- jquery添加select option两种代码思路比较
功能需求:在客户选择了check_in_date和check_out_date之后,将在check_in_date至check_out_date的promotions中自动添加符合条件的promoti ...
- 如何在Windows应用商店中提交您的Windows 8.1 应用更新
翘首以盼的Windows 8.1 不负众望的与大家见面了,与此同时也带来了全新的应用商店,小伙伴儿们要赶紧升级系统啦! 今天给大家介绍下如何提交一个Windows 8.1 的应用,其实微软针对这次系统 ...
- ReactJS 官网案例分析
案例一.聊天室案例 /** * This file provided by Facebook is for non-commercial testing and evaluation * purpos ...
- python 实现过滤出tomcat日志中含有ERROR 或Exception 的行并保存在另一个文件
遍历多个tomcat日志文件,找出含有ERROR 和Exception 的日志,并把该行日志输出到另一个文件中:(这里为了体现python模块导入的知识,所有建立了多个文件夹和模块) 项目结构: co ...