C#设计模式之建造者模式
建造者模式可以将部件本身和它们的组装过程分开,关注如何一步步创建一个包含多个组成部分的复杂对象,用户只需要指定复杂对象的类型即可得到该对象,而无须知道其内部的具体构造细节。
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式的定义:
将客户端与包含多个部件的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可;
关注如何逐步创建一个复杂的对象,不同的建造者定义了不同的创建过程;
建造者模式的结构:
建造者模式包含以下4个角色:
Builder(抽象建造者)
ConcreteBuilder(具体建造者)
Product(产品)
Director(指挥者)
例子:
/// <summary>
/// 抽象建造者
/// </summary>
public abstract class Builder
{
public abstract void BuilderPartA();
public abstract void BuilderPartB();
public abstract void BuilderPartC(); /// <summary>
/// //创建产品对象
/// </summary>
protected Product product = new Product();
/// <summary>
/// 返回产品对象
/// </summary>
/// <returns></returns>
public Product GetResult()
{
return product;
}
}
/// <summary>
/// 产品类
/// </summary>
public class Product
{
//生产的产品
public string PartA { get; set; }
public string PartB { get; set; }
public string PartC { get; set; }
}
/// <summary>
/// 具体建造者
/// </summary>
public class ConcreteBuilder:Builder
{
/// <summary>
/// 产品A
/// </summary>
public override void BuilderPartA()
{
product.PartA = "A1";
Console.WriteLine("生产了A1产品");
}
/// <summary>
/// 产品B
/// </summary>
public override void BuilderPartB()
{
product.PartB = "B1";
Console.WriteLine("生产了B1产品");
}
/// <summary>
/// 产品C
/// </summary>
public override void BuilderPartC()
{
product.PartC = "C1";
Console.WriteLine("生产了C1产品");
}
}
/// <summary>
/// 指挥者
/// </summary>
public class Director
{
private Builder _builder;
public Director(Builder builder)
{
this._builder = builder;
}
public void SetBuilder(Builder builder)
{
this._builder = builder;
}
/// <summary>
/// 产品构建与组装方法
/// </summary>
/// <returns></returns>
public Product Construct()
{
_builder.BuilderPartA();
_builder.BuilderPartB();
_builder.BuilderPartC();
return _builder.GetResult();
}
}
//客户端调用
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.Construct();
游戏不同角色案例:
/// <summary>
/// 游戏角色建造者,充当抽象建造者
/// </summary>
public abstract class ActorBuilder
{
public abstract void BuildType();
public abstract void BuildSex();
public abstract void BuildFace();
public abstract void BuildCostume();
public abstract void BuildHairstyle(); protected Actor actor = new Actor();
/// <summary>
/// 工厂方法,返回一个完整的游戏角色对象
/// </summary>
/// <returns></returns>
public Actor CreateActor()
{
return actor;
}
}
/// <summary>
/// 游戏角色类,充当复杂产品对象
/// </summary>
public class Actor
{
/// <summary>
/// 角色类型
/// </summary>
public string Type { get; set; }
/// <summary>
/// 性别
/// </summary>
public string Sex { get; set; }
/// <summary>
/// 面容
/// </summary>
public string Face { get; set; }
/// <summary>
/// 服装
/// </summary>
public string Costume { get; set; }
/// <summary>
/// 发型
/// </summary>
public string Hairstyle { get; set; }
}
/// <summary>
/// 英雄角色建造者,充当具体建造者
/// </summary>
public class Hero : ActorBuilder
{
public override void BuildType()
{
actor.Type = "英雄";
} public override void BuildSex()
{
actor.Sex = "男";
} public override void BuildFace()
{
actor.Face = "英俊";
} public override void BuildCostume()
{
actor.Costume = "盔甲";
} public override void BuildHairstyle()
{
actor.Hairstyle = "飘逸";
}
}
/// <summary>
/// 天使角色建造者,充当具体建造者
/// </summary>
public class Angel : ActorBuilder
{
public override void BuildType()
{
actor.Type = "天使";
} public override void BuildSex()
{
actor.Sex = "女";
} public override void BuildFace()
{
actor.Face = "漂亮";
} public override void BuildCostume()
{
actor.Costume = "白裙";
} public override void BuildHairstyle()
{
actor.Hairstyle = "披肩长发";
}
}
/// <summary>
/// 角色控制器,充当指挥者
/// </summary>
public class ActorController
{
/// <summary>
/// 逐步构建复杂产品对象
/// </summary>
/// <param name="ab"></param>
/// <returns></returns>
public Actor Construct(ActorBuilder ab)
{
ab.BuildType();
ab.BuildSex();
ab.BuildFace();
ab.BuildCostume();
ab.BuildHairstyle();
Actor actor = ab.CreateActor();
return actor;
}
}
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="builder" value="ConsoleApplication1.Angel"/>
</appSettings>
</configuration>
客户端调用:
//通过读取配置文件创建对象
string builderType = ConfigurationManager.AppSettings["builder"];
ActorBuilder _actor = (ActorBuilder)Assembly.Load("ConsoleApplication1").CreateInstance(builderType);
//直接创建对象
//ActorBuilder _actor = new Angel();// new Hero();
ActorController actorController = new ActorController();
//生产后返回对象实体
Actor actor = actorController.Construct(_actor);
Console.WriteLine(actor.Type);
Console.WriteLine(actor.Sex);
Console.WriteLine(actor.Face);
Console.WriteLine(actor.Costume);
Console.WriteLine(actor.Hairstyle);
Console.ReadKey();
C#设计模式之建造者模式的更多相关文章
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- C#设计模式(5)——建造者模式(Builder Pattern)
一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...
- 【GOF23设计模式】建造者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...
- C++设计模式之建造者模式(三)
4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
- GOF23设计模式之建造者模式
GOF23设计模式之建造者模式 场景: 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样的一个问题需要处理: 装配这些子组件是不是有个步骤问题? 实际开发中,我们所 ...
- java设计模式3——建造者模式
java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
随机推荐
- time step和采样频率的关系
当前的采样频率为11025HZ,overlap=0.5,取的是1024个采样点为1帧.则time step为256时的时间长度为11秒.即以11秒为单位分割原始的音频,生成一张语普图. >> ...
- p/invoke碎片--对数组的封送处理
因为数组是引用类型,所以数组的处理根据数组元素的类型是否为“可直接传递到非托管代码”的类型而分为两种情况.主要目标是看内存是怎么变化的,是复制还是锁定. 数组中的元素是"可直接传递到非托管代 ...
- ThinkphpCMF笔记
1.模板js,css文件__PUBLIC__ <link href="__TMPL__Public/style.css" rel="stylesheet" ...
- 文件IO操作..修改文件的只读属性
文件的IO操作..很多同行的IO工具类都是直接写..但是如果文件有只读属性的话..则会写入失败..所以附加了一个只读的判断和修改.. 代码如下: /// <summary> /// 创建文 ...
- Bubble Cup 8 finals C. Party (575C)
题意: 给定n个人,分两天晚上去夜总会开派对,要求每天恰好有n/2个人去,且每人去的夜总会各不相同. 每个人对不同的晚上不同的夜总会有不同的满意度,求一个方案使得所有人的满意度之和最大. 夜总会数量= ...
- FFmpeg-for IOS 一[安装]
FFmpeg编译环境搭建 准备 下载 gas-preprocessor 下载 ffmpeg包,ffmpeg 安装yasm,先安装homebrew,输入:ruby -e "$(curl -fs ...
- ls目录内容
ls:列出目录内容 1.常用参数: -a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件(常用) -A 同-a,但不列出“.”(表示当前目录)和“..”(表示当前目录的父目录). -c ...
- Java开源库
Java SE 7 API Docs from Oracle Apache IO库操作IO与文件 2.4 XML4j 1.6.1 Json.org google-json 2.5 WindowBuil ...
- 使用ICSharpCode.SharpZipLib.Zip类库解压zip文件的方法
public static bool ZipExtractFile(string zipFilePath,string targetPath) { FastZip fastZip = new Fast ...
- ecshop后台新功能权限的添加
1.在后台“推荐管理”里添加“推荐人分成”.“会员分成”两个操作功能以及权限 index.php?act=menu incluedes/inc_priv.php:权限对照表.inc_men ...