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秒为单位分割原始的音频,生成一张语普图. >> ...
- 【BZOJ-1127】KUP 悬线法 + 贪心
1127: [POI2008]KUP Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 317 Solved: 11 ...
- Beta版本冲刺第一天
Aruba 408 409 410 428 429 431 完成任务: 瀑布流方块长按删除提示 实现获取剪贴板内容并保存到数据库 常驻通知栏模块界面实现,设置按钮并预留intent 立会照片: 燃尽图 ...
- 使用vuejs框架进行列表渲染
爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6170706.html 1.通过Script引入Vuejs框架 <script t ...
- NFS 文件系统
NFS的安装是非常简单的,只需要两个软件包即可,而且在通常情况下,是作为系统的默认包安装的. NFS服务的主要配置文件 /etc/exports /etc/exports文件内容格式: <输出目 ...
- JavaScript中事件和属性有什么区别吗?或者说事件与方法有什么区别?
https://zhidao.baidu.com/question/1691946187489353788.html
- Gradle Maven 依赖管理
仓库管理简介 本质上说,仓库是一种存放依赖的容器,每一个项目都具备一个或多个仓库. Gradle支持以下仓库格式: Ivy仓库 Maven仓库 Flat directory仓库 我们来看一下,对于每一 ...
- 【linux使用】bash shell命令行常用快捷键 (转载)
移动: Ctrl + A: 移动到当前编辑的命令行首, Ctrl + E: 移动到当前编辑的命令行尾, Ctrl + F 或 ->:按字符右移(往命令行尾部方向,前移) Ctrl + B 或 & ...
- Code Snippets 代码片段
Code Snippets 代码片段 1.Title : 代码片段的标题 2.Summary : 代码片段的描述文字 3.Platform : 可以使用代码片段的平台,有IOS/OS X/ ...
- Android如何一进入一个activity就唤醒键盘
方法总结: 在AndroidManife.xml中对应的的Activity配置中加入以下配置项: android:windowSoftInputMode="stateVisible|adju ...