建造者模式是一种创建型设计模式,它的模式动机是:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
建造者模式是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成,它将变与不变分离,即产品的组成部分是不变,但每一部分是可以灵活选择的,它与工厂方法模式的关注点不同,工厂方法模式更注重零部件的创建过程,而建造者模式更注重零部件的组装过程,二者可以结合使用。
建造者模式组成:(1)产品角色Product;(2)抽象建造者Builder;(3)具体建造者Concrete Builder;(4)指挥者Director;
其中产品角色类决定产品有哪些零件组成;抽象建造者抽象各个零件的创建方法;具体建造者负责各个零件的具体创建方法的实现;指挥者负责调用具体建造者创建零件并组装成产品角色对象。
该模式中每个产品角色的构成都是一样的,这不是变化点,但是每个零件都是可变的这才是变化点。例如一台电脑,它的构成大致有CPU,显卡等;这是不变的,每个电脑都要有CPU和显卡。但是,每个CPU零件、显卡零件是可变的,可以使用AMD的CPU也可以使用酷睿的CPU;可以使用英伟达的显卡,也可以使用AMD的显卡,这才是变化点。正因为这些零件是可变的,所以要将创建这些零件的方法抽象出来。
举个具体的例子:我作为客户去电脑城买组装电脑,电脑就是产品角色类,其中包含了显卡、CPU这些属性定义;现在老板有不同的整机机型,机型A里有英伟达3090显卡配酷睿i7十代显卡,机型B里是英伟达1050显卡配酷睿i5八代显卡,这两种机型就是两个具体建造者类;除了这两个机型,老板还可以随意组装,谁也不知道会组装出什么机型,所以要封装这种变化,于是有了抽象建造者类;而老板自然就是指挥者类,他负责将零件按机型组装好,并将一个完整的电脑返回给客户我。以下是例子的代码:
//产品角色类
public class Computer
{
private String CPU;
private String Graphics;
public void SetCPU(String CPU){ this.CPU=CPU; }
public void SetGraphics(String Graphics){ this.Graphics=Graphics; }
}
//抽象建造者类
public abstract class Builder
{
public Computer computer=new Computer();
public abstract void BuildCPU();
public abstract void BuildGraphics();
public Computer GetComputer(){ return computer; }
}
//具体建造者类
public class ComputerBuilder_A:Builder
{
public override void BuildCPU(){ computer.SetCPU("酷睿i7十代"); }
public override void BuildGraphics(){ computer.SetGraphics("英伟达3090显卡");}
}
public class ComputerBuilder_B:Builder
{
public override void BuildCPU(){ computer.SetCPU("酷睿i5八代"); }
public override void BuildGraphics(){ computer.SetGraphics("英伟达1050显卡");}
}
//指挥者类
public class Director
{
public Computer Construct(Builder builder)
{
builder.BuilderCPU();
builder.BuilderGraphics();
return builder.GetComputer();
}
}
public class Client{
public static void main(String[] args)
{
Builder builder = new ComputerBuilder_A();
Director director = new Director();
Product product = director.construct(builder);
}
}
该模式适用于:
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;
2.当构造过程必须允许被构造的对象有不同的表示时;
该模式使对象的构建和表示分离,无论其零件如何变化都可轻易扩展,但如果产品内部属性变化,例如上面的电脑增加了一个硬件,那么所有建造者都要修改。因此该模式使用时,其产品内部构成必须相同,不会变化。