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.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
随机推荐
- Mysql多表表关联查询 inner Join left join right join
Mysql多表表关联查询 inner Join left join right join
- Python Logging模块的简单使用
前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...
- Linux下查看chm文件
第一种方法.安装xchm,安装命令sudo apt-get install xchm,打开xchm,在终端下输入xchm. 第二种方法.安装kchmviewer,安装命令sudo apt-get in ...
- android 一些常用开源框架
网络请求compile 'com.squareup.okhttp:okhttp:2.6.0'okhttp依赖compile 'com.squareup.okio:okio:1.6.0'json解析co ...
- OncrickListener的实现
在Java中实现的监控事件的方法 button.addActionListener(new ActionListener() { @Override public void actionPerform ...
- Django基础,Day8 - 管理后台定制显示
自定义admin表单 展示效果一: from django.contrib import admin from polls.models import Question class QuestionA ...
- getElementsByClassName简单实现
function getElementsByClassName(node, className) { var aClassReg = className.split(' ').map(function ...
- mysql-开启慢查询&所有操作记录日志
在运营网站的过程中,可能会遇到网站突然变慢的问题,一般情况下和 MySQL 慢有关系,可以通过开启慢查询,找到影响效率的 SQL ,然后采取相应的措施.下面介绍一下如何开启慢查询: 1.开启慢查询 找 ...
- jquery 杂记
返回指定属性名的属性值:getAttribute() 设置元素的属性值:attr('src',voiceurl) form表单: 序列化表单值: $('#formid').serialize() ...
- Demo 版
Demo1 美食网站 Demo2 12301智慧旅游公共服务平台 Demo3 react_and_koa example