一、什么是建造者模式
建造者模式关注的是对复杂对象的创建。
它有四个角色,按我的理解的话分别是:
比如现在需要组装一台电脑
- 用户:最终使用电脑的角色
- 装机员:组装电脑的角色
- 说明书:电脑的零件清单等
- 厂家销售:获取各个零件
可能不太准确,大概就这么个意思。
二、建造者模式的使用场景
这个在平时项目中用的不是很多,因为只有当流程固定的时候才能使用建造者模式,其他时候就不太适用了。
当我们最终需要创建的对象依赖于其他对象的创建时可以使用建造者模式,将创建对象的过程转移,这样上端就跟之前一样能直接获得最终需要使用的对象。
三、如何实现建造者模式
用户Program.cs:
namespace Builder
{
class Program
{
static void Main(string[] args)
{
{
AbstractBuilder builder = new SaleHW();
Installer installer = new Installer(builder);
Computer computer = installer.GetComputer();
Console.WriteLine("我的计算机:"+ computer.Name);
}
Console.WriteLine("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
{
AbstractBuilder builder = new SaleXM();
Installer installer = new Installer(builder);
Computer computer = installer.GetComputer();
Console.WriteLine("我的计算机:" + computer.Name);
}
}
}
}
厂家销售SaleHW.cs:
namespace Builder
{
public class SaleHW : AbstractBuilder
{
private Host _Host = null;
private Keyboard _Keyboard = null;
private Monitor _Monitor = null;
private Mouse _Mouse = null;
private VoiceBox _VoiceBox = null;
public override void Host()
{
this._Host = new Host()
{
Name = "华为主机"
};
}
public override void Keyboard()
{
this._Keyboard = new Keyboard()
{
Name = "华为键盘"
};
}
public override void Monitor()
{
this._Monitor = new Monitor()
{
Name = "华为显示器"
};
}
public override void Mouse()
{
this._Mouse = new Mouse()
{
Name = "华为鼠标"
};
}
public override void VoiceBox()
{
this._VoiceBox = new VoiceBox()
{
Name = "华为音箱"
};
}
public override Computer Computer()
{
Console.WriteLine("组装 {0} {1} {2} {3} {4}", this._Host.Name, this._Keyboard.Name, this._Monitor.Name, this._Mouse.Name, this._VoiceBox.Name);
return new Computer(_Host, _Keyboard, _Monitor, _Mouse, _VoiceBox)
{
Name = "华为计算机"
};
}
}
}
装机员Installer.cs:
namespace Builder
{
public class Installer
{
private AbstractBuilder _AbstractBuilder = null;
public Installer(AbstractBuilder builder)
{
this._AbstractBuilder = builder;
}
public Computer GetComputer()
{
this._AbstractBuilder.Host();
this._AbstractBuilder.Keyboard();
this._AbstractBuilder.Monitor();
this._AbstractBuilder.Mouse();
this._AbstractBuilder.VoiceBox();
return this._AbstractBuilder.Computer();
}
}
}
说明书AbstractBuilder.cs:
namespace Builder
{
public abstract class AbstractBuilder
{
public abstract void Host();
public abstract void Keyboard();
public abstract void Monitor();
public abstract void Mouse();
public abstract void VoiceBox();
public abstract Computer Computer();
}
}
各个零件:
//Computer.cs
namespace Builder.Models
{
public class Computer
{
public Computer(Host host,Keyboard keyboard,Monitor monitor,Mouse mouse,VoiceBox voiceBox)
{
}
public string Name { get; set; }
}
}
//Host.cs
namespace Builder.Models
{
public class Host
{
public string Name { get; set; }
}
}
//Keyboard.cs
namespace Builder.Models
{
public class Keyboard
{
public string Name { get; set; }
}
}
//Monitor.cs
namespace Builder.Models
{
public class Monitor
{
public string Name { get; set; }
}
}
//Mouse.cs
namespace Builder.Models
{
public class Mouse
{
public string Name { get; set; }
}
}
//VoiceBox.cs
namespace Builder.Models
{
public class VoiceBox
{
public string Name { get; set; }
}
}
四、建造者模式的优缺点
只有当流程固定的时候才能使用建造者模式,其他时候就不太适用了。
将创建对象的细节转移,让上端不在关注创建的过程,方便上端的使用。