建造者模式
在日常生活中有这样一个场景,我想要一台电脑,但是我又不想要自己买配件组装,于是找到一个店铺把找到满意的电脑下单,商家在收到我的订单之后,开始安排技术人员组装,组装好之后再把电脑寄过来。
对于一台电脑来说,里面包含CPU、主板、显卡、内存、硬盘、电源、机箱等等配置,可以把电脑当成一个复杂的对象,CPU,主板等电脑配件,又有很多种选择,但是组装电脑的过程基本是一样的,这时候就可以用建造者模式实现这一过程。
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
我们来已创建一个水杯举例子,代码如下。
using System;
namespace _04_Builder
{
/// <summary>
/// 建造者
/// </summary>
class Program
{
static void Main(string[] args)
{
//小明要制作一个运动水杯
Builder b1 = new SportCupBuilder();
Director director = new Director(b1);
director.Create();
Cup cup = new Cup();
cup.Drink();
Console.ReadKey();
}
}
public class Director
{
Builder b = null;
public Director(Builder builder)
{
b = builder;
}
public void Create()
{
b.BuildString();
b.BuildCap();
b.BuildBody();
}
}
//我想定制个水杯
public abstract class Builder
{
public abstract void BuildString();
public abstract void BuildCap();
public abstract void BuildBody();
}
/// <summary>
/// 运动水杯
/// </summary>
public class SportCupBuilder : Builder
{
public override void BuildString()
{
Console.WriteLine("经历一番工作把杯子绳做好了");
}
public override void BuildCap()
{
Console.WriteLine("杯盖做好了");
}
public override void BuildBody()
{
Console.WriteLine("杯子主体做好了");
}
}
//这是我们要制作的水杯
public class Cup
{
private string myString;//绳子
private string body; //主体
private string cap; //杯盖
public string MyString
{
get { return myString; }
set { myString = value; }
}
public string Body
{
get { return body; }
set { body = value; }
}
public string Cap
{
get { return cap; }
set { cap = value; }
}
public void Drink()
{
Console.WriteLine("喝水。。。吨吨吨");
}
}
}
如果说需要在创建另外的一种水杯,同样是又杯绳,杯盖,杯体组成的话,就可以仿照SportCupBuilder
方法在写一个方法继承自Builder
即可。