四、Builder模式
4.1 Builder模式的概念
- 定义
将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
- 应用场景
- 复杂对象由多个子对象组成,子对象的创建因需求不同而不同,但调用子对象的创建并将子对象组装成一个整体对象的逻辑算法是不变的。
- 例如,生产手机,手机屏幕、CPU的规格型号会有所不同,会有不同的创建方式,但组装手机的过程是不变的。
- 使用条件
- 条件一:是一个对象的构建,最终返回的也只是一个对象
- 和抽象工厂模式不同
- 抽象工厂是提供一系列多类别对象的创建方法,客户可以使用生产某系列对象的工厂去创建所需要的一批对象
- builder模式虽然也需要创建一批子对象,但这些对象是作为一个复杂对象的一部分,从属于该复杂对象的,最终想要得到的是一个复杂对象。
- 和抽象工厂模式不同
- 条件二:子对象之间没有耦合关系,但必须具备子对象的创建方法
- 例如,手机屏幕、CPU之间没有强烈的耦合关系,不需要强调高分辨率的屏幕必须搭载高性能的CPU,可以任意搭配,但子对象的创建方法都是必须具备的
- 由于子对象可以是任意组合,所以无法定义具体的类来对应某一个组合
- 而且客户可能并不关心是苹果手机还是华为手机,只需要满足想要的配置即可
- 条件一:是一个对象的构建,最终返回的也只是一个对象
- 变化点
- 子对象的创建因需求不同而变化
- 例如,今天我需要一部手机,它由高分辨率和高性能的CPU组成,明天我需要另外一部手机,它由低分辨率和高性能的CPU组成,后天我又需要另一部手机,它由低分辨率和低性能的CPU组成
4.2 Builder模式的实现
- 将子对象的创建隔离封装起来
- director
- 负责复杂对象的组装,组装算法是稳定不变的,接收一个builder类型的对象,返回一个复杂对象
- builder抽象类
- 负责定义供director调用的接口,规定必须实现哪些子对象的创建过程
- concreteBuilder
- 负责子对象具体的创建过程
public abstract class Screen
{
public abstract void PrintScreen();
}
public abstract class CPU
{
public abstract void PrintScreen();
}
public class HighPixScreen : Screen
{
public override void PrintScreen()
{
Console.WriteLine("高分辨率");
}
}
public class LowPixScreen : Screen
{
public override void PrintScreen()
{
Console.WriteLine("低分辨率");
}
}
public class HighPerformanceCPU : CPU
{
public override void PrintScreen()
{
Console.WriteLine("高性能CPU");
}
}
public class LowPerformanceCPU : CPU
{
public override void PrintScreen()
{
Console.WriteLine("低性能CPU");
}
}
public class Phone
{
public Screen Screen;
public CPU Cpu;
public void PrintPhoneInfo()
{
Screen.PrintScreen();
Cpu.PrintScreen();
}
}
public abstract class PhoneBuilder
{
protected Phone Phone = new Phone();
public abstract void BuildScreen();
public abstract void BuildCPU();
public abstract Phone GetPhone();
}
public class HighScreenHighCPUPhoneBuilder : PhoneBuilder
{
public override void BuildCPU()
{
base.Phone.Cpu = new HighPerformanceCPU();
}
public override void BuildScreen()
{
base.Phone.Screen = new HighPixScreen();
}
//可以提到基类去实现
public override Phone GetPhone()
{
return base.Phone;
}
}
public class LowScreenLowCPUPhoneBuilder : PhoneBuilder
{
public override void BuildCPU()
{
base.Phone.Cpu = new LowPerformanceCPU();
}
public override void BuildScreen()
{
base.Phone.Screen = new LowPixScreen();
}
//可以提到基类去实现
public override Phone GetPhone()
{
return base.Phone;
}
}
public class PhoneDirector
{
public Phone GetPhone(PhoneBuilder phoneBuilder)
{
phoneBuilder.BuildScreen();
phoneBuilder.BuildCPU();
return phoneBuilder.GetPhone();
}
}
class Program
{
static void Main(string[] args)
{
PhoneDirector phoneDirector = new PhoneDirector();
Phone phone = phoneDirector.GetPhone(new HighScreenHighCPUPhoneBuilder());
phone.PrintPhoneInfo();
Console.ReadLine();
}
}