建造者模式可以将部件本身和它们的组装过程分开,关注如何一步步创建一个包含多个组成部分的复杂对象,用户只需要指定复杂对象的类型即可得到该对象,而无须知道其内部的具体构造细节。

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

建造者模式的定义:

将客户端与包含多个部件的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可;

关注如何逐步创建一个复杂的对象,不同的建造者定义了不同的创建过程;

建造者模式的结构:

建造者模式包含以下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#设计模式之建造者模式的更多相关文章

  1. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  2. C#设计模式(5)——建造者模式(Builder Pattern)

    一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...

  3. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  4. C++设计模式之建造者模式(三)

    4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...

  5. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  6. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  7. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  8. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  9. GOF23设计模式之建造者模式

    GOF23设计模式之建造者模式 场景: 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样的一个问题需要处理: 装配这些子组件是不是有个步骤问题? 实际开发中,我们所 ...

  10. java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

随机推荐

  1. 通过维基API实现维基百科查询功能

    通过英文维基的免费API,可以实现对维基百科的搜索查询或者标题全文查询等,尝试了一下通过title实现全文查询,返回的结果是wikitext格式,暂时不知道该如何应用,所以仅实现了查询功能,可以返回最 ...

  2. pip apt source images

    ~/.pip/pip.conf [global] index-url = https://pypi.douban.com/simple download_cache = ~/.cache/pip [i ...

  3. UP Board 超详细开箱评测

    前言 原创文章,转载引用务必注明链接. 江浙沪就是好,昨天发货今天收到.另外爱板太省了,外包装小纸箱还是6s钢化膜的重复利用. 注意:拍照自带抖动功能,画质大家凑合着看.冬日天气干燥,手触摸板子前建议 ...

  4. fedora自带OpenJDK,所以如果安装官方的JDK的话要先删除OpenJDK

    1:rpm -qa|grep jdk 查看当前的jdk情况. 2:yum -y remove java java-1.7.0-openjdk* 卸载openjdk,这个过程中因为依赖原因可能会卸载一些 ...

  5. eclipse使用sublime配色(转)

    转自 Eclipse设置类似Sublime Text 编辑区皮肤,风格,颜色 1.首先打开eclipse 2.help -> Install New SoftWare  3.点击 Add 在Na ...

  6. 网络抓包wireshark(转)

    转自 网络抓包wireshark   抓包应该是每个技术人员掌握的基础知识,无论是技术支持运维人员或者是研发,多少都会遇到要抓包的情况,用过的抓包工具有fiddle.wireshark,作为一个不是经 ...

  7. wamp 局域网访问

    1.关闭防火墙 2.设置apache 的httpd.conf 第278行 正确代码如下 # onlineoffline tag - don't remove Require all granted O ...

  8. OperateLoger

    protected void Page_Load(object sender, EventArgs e) { OperateLoger.FunctionInfo =new FunctionInfo { ...

  9. Android中AIDL的理解与使用(一)——跨应用启动/绑定Service

    AIDL(Android Interface Definition Language)--安卓接口定义语言 一.startService/stopService 1.同一个应用程序启动Service: ...

  10. JavaMail: SSL vs TLS vs STARTTLS

    SSL vs TLS vs STARTTLS There's often quite a bit of confusion around the different terms SSL, TLS an ...