一、应用场景
在软件开发中,有时会面临着一个复杂对象的创建工作,通常各个部分的子对象用一定的算法构成,由于需求的变化,这个复杂对象的各个部分也经常面临着剧烈的变化,但是将他们组合到一起却相对的稳定。
子部件较多,没有恰当赋值之前,对象不能当做一个完整的对象或者产品使用(邮件包括发件人、收件人、抄送人、主题、内容)
子部件需要按照一定顺序进行赋值才有意义,在某个子部件没有赋值之前,另一个子部件就无法赋值(装修要先改水电、再贴瓷砖、家电、电视墙)
二、小白装电脑
代码语言:javascript复制 public class Computer
{
private List<string> lstPart = new List<string>();
public void Addpart(string part)
{
lstPart.Add(part);
}
public void ShowComputer()
{
foreach (string item in lstPart)
{
Console.WriteLine("正在安装" item);
}
}
}
代码语言:javascript复制 //问题1、所有的内容全部由客户自己搞定
//问题2、创建对象和客户端强耦合
Computer computer = new Computer();
computer.Addpart("i5的CPU");
computer.Addpart("独显");
computer.Addpart("256G的硬盘");
computer.Addpart("17寸的显示器");
computer.Addpart("win10的操作系统");
三、老鸟装电脑
建造者模式,是将一个复杂对象的创建和它的表示分离,使得同样的创建过程,可以创建不同的对象。在建造者模式中出现的四个不同类对象:
- AbstractBuilder 抽象建造者,为创建一个产品对象的各个部件指定的抽象接口,在该接口或抽象类中,提供两种方法:一是各个组件的创建方法,二是产品对象的返回方法,用于将创建完的对象返回;
- ConcreteBuilder 具体建造者,实现或者继承抽象建造者,实现各个组件的创建方法和对象返回方法。
- Product 被构建的复杂产品对象,包含多个组件;
- Director 监工,负责安排复杂对象的创建顺序。
//具体的产品
public class Computer
{
private List<string> lstPart = new List<string>();
public void Addpart(string part)
{
lstPart.Add(part);
}
public void ShowComputer()
{
foreach (string item in lstPart)
{
Console.WriteLine("正在安装" item);
}
}
}
//抽象的创建者
public interface IbuilderComputer
{
//1.封装创建各个对象的过程
void BuildCpu();
void BuildDisk();
void BuildMemory();
void BuildScreen();
void BuildSystem();
//2.将创建好的对象返回
Computer GetComputer();
}
//高配电脑 具体的创建者
public class GoodComputer : IbuilderComputer
{
private Computer computer = new Computer();
public void BuildCpu()
{
computer.Addpart("i7的cpu");
}
public void BuildDisk()
{
computer.Addpart("2T的固态硬盘");
}
public void BuildMemory()
{
computer.Addpart("32G的内存");
}
public void BuildScreen()
{
computer.Addpart("32寸的显示器");
}
public void BuildSystem()
{
computer.Addpart("win10处理器");
}
public Computer GetComputer()
{
return this.computer;
}
}
//低配电脑 具体的创建者
public class LowComputer : IbuilderComputer
{
private Computer computer = new Computer();
public void BuildCpu()
{
computer.Addpart("i3的cpu");
}
public void BuildDisk()
{
computer.Addpart("1T的固态硬盘");
}
public void BuildMemory()
{
computer.Addpart("16G的内存");
}
public void BuildScreen()
{
computer.Addpart("20寸的显示器");
}
public void BuildSystem()
{
computer.Addpart("win8处理器");
}
public Computer GetComputer()
{
return this.computer;
}
}
//监工 创建对象的顺序
public class Directory
{
public void BuildComputer(IbuilderComputer builderComputer)
{
builderComputer.BuildCpu();
builderComputer.BuildDisk();
builderComputer.BuildMemory();
builderComputer.BuildScreen();
builderComputer.BuildSystem();
}
}
代码语言:javascript复制 IbuilderComputer b1 = new GoodComputer();
IbuilderComputer b2 = new LowComputer();
Directory directory = new Directory();
//让b1这个具体的创建者按照稳定的过程(要求的逻辑),进行复杂对象的创建
directory.BuildComputer(b1);
Computer computer1= b1.GetComputer();
computer1.ShowComputer();
directory.BuildComputer(b2);
Computer computer2 = b2.GetComputer();
computer2.ShowComputer();