设计模式之建造者模式

一、什么是建造者模式

建造者模式,将一个复杂对象的构建和它的表示分离,使同样的构建构成可以创建不同的表示。

从定义可以看出,建造者模式适用于一个复杂的对象的建造,而且在建造的过程中,客户端不必知道产品内部组成的细节,实现了构建和装配的解耦。

二、建造者模式角色

  • 抽象建造者类(Builder):实现复杂对象的那部分的创建,并不涉及具体的部件对象的创建。
  • 具体建造者类(ConcreteBuilder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。
  • 产品类(Product):要创建的复杂对象。
  • 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

三、建造者模式UML类图

设计模式之建造者模式插图

四、建造者模式优缺点

优点:

  1. 封装性好。在使用建造者模式中的场景中,产品类和建造者类是比较稳定的,将主要的业务逻辑封装在指挥者类中。
  2. 产品创建与产品组装解耦。客户端无需知道产品内部组成的细节。
  3. 更加精细的控制产品的创建过程。将复杂产品的创建步骤分解到不同的方法中,使得创建过程更加清晰可控。
  4. 扩展性强。如果新增一个建造者类,不需要修改之前的代码,符合开闭原则。

缺点:

  1. 不适合产品之间差异性较大的场景,使用范围受到一定限制。

五、建造者模式demo示例

1、Demo需求

模拟泡红茶:泡红茶分3步,1-向茶壶加水,2-把水烧开,3-加入茶叶,使用建造者模式来实现。

2、代码实现

/**
  * 产品类:茶
  */ public class Tea {

     private String name;
 
     public Tea(String name) {
         this.name = name;
     }
 
     public String getName() {
         return name;
     }
 
     public void setName(String name) {
         this.name = name;
     }
 }
/**
  * 抽象建造者类
  */ public abstract class ITeaBuilder {

     public abstract void addWater();
     public abstract void boilWater();
     public abstract void addTea();
     public abstract Tea buildTea();
 }
/**
  * 红茶建造者类
  */ public class RedTeaBuilder extends ITeaBuilder {

     private Tea tea = new Tea(" 红茶 ");

     public void boilWater() {
         System.out.println("烧开水...");
     }
 
     public void addTea() {
         System.out.println("加入茶叶...");
     }
 
     public void addWater() {
         System.out.println("加入热水...");
     }
 
     public Tea buildTea() {
         System.out.println("红茶泡好了....");
         return tea;
     }
 }
/**
  * 指挥者类:负责泡茶过程顺序
  */ public class RedTeaDirector {

     public Tea createTea(ITeaBuilder teaBuilder) {
         teaBuilder.boilWater();
         teaBuilder.addTea();
         teaBuilder.addWater();
         return teaBuilder.buildTea();
     }
 }

3、测试

public class Client {

     public static void main(String[] args) {
         RedTeaDirector teaDirector = new RedTeaDirector();
         Tea redTea = teaDirector.createTea(new RedTeaBuilder());
         System.out.println("==========================");
     }
 }

发表评论