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.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
随机推荐
- PHPstorm同步文件时与ftp断开连接
一用PHPstorm同步对比服务器端和本地文件的差异时,一会就断开ftp再也连不上了,弄了好久终于找到原因了,好像这个同步会频繁请求建立连接,服务器本地安全策略屏蔽了ip,还是下载后再做修改或者直接在 ...
- Codeforces Round #384 (Div. 2) B. Chloe and the sequence(规律题)
传送门 Description Chloe, the same as Vladik, is a competitive programmer. She didn't have any problems ...
- http请求与响应(content-type)
http请求信息由浏览器把地址栏URL信息和页面(html.jsp.asp)组装成http请求消息体(如下). <request-line>(请求消息行)<headers>(请 ...
- pandas read table
http://pandas.pydata.org/pandas-docs/stable/10min.html import pandas as pd res = pd.read_table(" ...
- Hibernate组件和关联映射
一.基本定义 组件:建立一个类,为了方便代码复用和建立模型,但类在数据库中并没有对应的表,此类可以作为一个组件插入到其他类中(有数据表的类) 组件和关联映射的关系是组件是没有对应的类;组件是值类型的, ...
- Linux学习之CentOS(二十一)--Linux系统启动详解
在这篇随笔里面将对Linux系统的启动进行一个详细的解释!我的实验机器是CentOS6.4,当然对于现有的Linux发行版本,其系统的启动基本上都是一样的! 首先我们来看下Linux系统启动的几个 ...
- MVC防止xss攻击 ——Html.AntiForgeryToken的AJAX提交
1.在Html表单里面使用了@Html.AntiForgeryToken()就可以阻止CSRF攻击. 2.相应的我们要在Controller中也要加入[ValidateAntiForgeryToken ...
- Android中仿IOS提示框的实现
前言 在Android开发中,我们有时需要实现类似IOS的对话框.今天我就来总结下,如何通过自定义的开发来实现类似的功能. 自定义Dialog 我们知道Android中最常用的对话框就是Dialog及 ...
- volatile关键字 学习记录1
虽然已经工作了半年了...虽然一直是在做web开发....但是平时一直很少使用多线程..... 然后最近一直在看相关知识..所以就有了这篇文章 用例子来说明问题吧 public class Volat ...
- 关于在Xcode控制台打印的注意点
注意!!在控制台中打印语句的返回值,这句代码也算是被执行过了一次 比如在下列代码的if语句执行之前,现在控制台打印 [_dataBaseexecuteUpdate:createSql] 的布尔值 if ...