美文网首页
建造者模式

建造者模式

作者: 内卷程序员 | 来源:发表于2021-09-28 11:06 被阅读0次

建造者模式概述

  • Builder模式(建造者模式),将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
  • 当一个类的构造方法中参数过多时, 有些是可选的参数,可以考虑使用Builder模式。
  • Builder模式分二种,一种是经典的Builder模式,第二种是变种Builder模式,而现在Android开发普遍使用的是第二种的变种Builder模式

经典的Builder模式

3864941-99c4.jpg

Builder模式里的四种角色

  • Builder:抽象的建造者。
  • ConcreteBuilder:具体的建造者,继承自Builder,通常不止一个
  • Product:被构造的复杂对象
  • Director:指挥者,指挥建造者去建造一个产品
/**
 * 抽象建造者类
 *
 */
public abstract class Builder {

    public abstract void setName();

    public abstract void setSize();

    public abstract Product getProduct;

}

 ---------------------------------------------------------------------------------------------------- 

/**
 * 指挥者类
 *
 */
public class Director {

    public void construct(Builder builder) {
        builder.setName();
        builder.setSize();
    }

}
 
 ---------------------------------------------------------------------------------------------------- 

/**
 * 产品类
 *
 */
public class Product {

private  String name;
private  int size

public Product (String name, int size){
   this.name =name;
   this.size = size;
}

public void show() {
   System.out.println("名称: " + name + "尺寸:"+size);
  }
}
 
 ---------------------------------------------------------------------------------------------------- 

/**
 * ConcreteBuilder
 *
 */
public class ConcreteBuilder extends Builder {

  private Product product ;

  public ConcreteBuilder (String name, int size) {
        product = new Product (name, name);
    }
    @Override
    public void setName(String name) {
      product.name =name;
    }

    @Override
    public void setSize(int size) {
      product.size = size;
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

 ---------------------------------------------------------------------------------------------------- 
 
/**
 * 客户端调用,建造者模式(Builder)
 *
 */
public class Client {

    public static void main(String[] args) {
        Director director = new Director();
        Builder builder = new ConcreteBuilder();

        director.construct(builder );
        Product product  = builder.getProduct();
        product.show();
    }

}


3864941.jpg
/**
 * 产品
 */
 class Product {
    private String partA;
    private String partB;
    private String partC;
    public void setPartA(String partA) {
        this.partA = partA;
    }
    public void setPartB(String partB) {
        this.partB = partB;
    }
    public void setPartC(String partC) {
        this.partC = partC;
    }
    public void show() {
        //显示产品的特性
    }
}

 ---------------------------------------------------------------------------------------------------- 

/**
 *  指挥者:调用建造者中的方法完成复杂对象的创建。
 */
class Director {

    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    //产品构建与组装方法
    public void construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
 
    public Product getProduct (){
      return builder.getProduct ();
   }
   
}

 ---------------------------------------------------------------------------------------------------- 

/**
 * 抽象建造者:包含创建产品各个子部件的抽象方法。
 */
abstract class Builder {
    //创建产品对象
    protected Product product = new Product();
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract void buildPartC();
    //返回产品对象
    public Product getProduct () {
        return product;
    }
}

 ---------------------------------------------------------------------------------------------------- 

/**
 * 具体建造者:实现了抽象建造者接口。
 */
public class ConcreteBuilderA extends Builder {
    public void buildPartA() {
        product.setPartA("A建造 PartA");
    }
    public void buildPartB() {
        product.setPartB("A建造 PartB");
    }
    public void buildPartC() {
        product.setPartC("A建造 PartC");
    }
}

 ---------------------------------------------------------------------------------------------------- 

/**
 * 具体建造者:实现了抽象建造者接口。
 */
public class ConcreteBuilderB extends Builder {
    public void buildPartA() {
        product.setPartA("B建造 PartA");
    }
    public void buildPartB() {
        product.setPartB("B建造 PartB");
    }
    public void buildPartC() {
        product.setPartC("B建造 PartC");
    }
}

 ---------------------------------------------------------------------------------------------------- 

/**
 * 客户类
 */
public class Client {
    public static void main(String[] args) {

        Builder builderA = new ConcreteBuilderA();
        Builder builderB = new ConcreteBuilderB();
     

        Director director = new Director(builderA );
        Product productA = director .getResult();
        productA .show();

        Director director = new Director(builderB);
        Product productB = director .getResult();
        productB .show();
    }
}

变种Builder模式

  • 在Product 中创建一个静态内部类 Builder,然后将Product 中的参数都复制到Builder类中。
  • 在Builder中创建设置函数,对Product 中那些可选参数进行赋值,返回值为Builder类型的实例
  • 在Builder中创建一个build()方法,在其中构建Product 的实例并返回
  • Product 类的构造方法可以设置私有的。也就是说调用者不能直接创建Product 对象,必须通过Builder创建
  • Builder的内部类构造方法中只接收必传的参数,并且该必传的参数可以用final修饰符
public class Product{

    private final String firstName;     // 必传参数
    private final String lastName;      // 必传参数
    private final int age;              // 可选参数
    private final String phone;         // 可选参数
    private final String address;       // 可选参数

    private User(Builder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.age = builder.age;
        this.phone = builder.phone;
        this.address = builder.address;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }

    public String getAddress() {
        return address;
    }

    public static class Builder {
        private final String firstName;
        private final String lastName;
        private int age;
        private String phone;
        private String address;

        public Builder(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }

        public UserBuilder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public UserBuilder address(String address) {
            this.address = address;
            return this;
        }

        public Productbuild() {
            return new Product(this);
        }
    }
}

客户端链式调用

public class Client {
    public static void main(String[] args) {

       new Product.Builder("艺术", "小二")
                .age(20)
                .phone("123456789")
                .address("中国")
                .build();
    }
}

相关文章

  • Builder Pattern in Java

    建造者模式:建造者模式定义建造者模式应用场景实现案例Jdk中的建造者模式建造者模式的优点建造者模式的缺点 建造者模...

  • 设计模式(4) 建造者模式

    什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与...

  • 建造者模式(部件构造)

    目录 建造者模式的理念 从 POJO 到建造者模式的思考 怎么来实现建造者模式 建造者模式在Android源码中的...

  • 【设计模式】之建造者Builder模式

    建造者模式 什么是建造者模式? 建造者模式属于创建型模式的一员,可以控制对象的实例化过程。建造者模式简化了复杂对象...

  • 建造者模式

    一、建造者模式介绍 二、建造者模式代码实例

  • 建造者模式

    建造者模式 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和...

  • 建造者模式:深入理解建造者模式 ——组装复杂的实例

    目录: 一 建造者模式介绍 1.1 定义 1.2 为什么要用建造者模式(优点)? 1.3 哪些情况不要用建造者模式...

  • 设计模式之建造者模式

    设计模式之建造者模式 Intro 简介 建造者模式: 建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加...

  • 一、设计模式(构建模式)——03建造模式与原型模式

    建造者模式 建造型模式用于创建过程稳定,但配置多变的对象。 建造模式的实现要点: 在建造者模式中,指挥者是直接与客...

  • 创建型模式:建造者模式

    个人公众号原文:创建型模式:建造者模式 五大创建型模式之四:建造者模式。 简介 姓名 :建造者模式 英文名 :Bu...

网友评论

      本文标题:建造者模式

      本文链接:https://www.haomeiwen.com/subject/lyvhnltx.html