Java设计模式-不能不知道的建造者模式

1. 基础介绍

  1. 主要用来创建复杂的对象;
  2. 分离了对象子组件的单独构造(Builder负责)和装配(Director负责),这就形成了一个创建复杂对象的基础,首先Builder创建对象,然后Director把所有的对象综合起来;前面的工厂模式,只是创造一个简单的产品(其中的组装顺序一样);
  3. 由于构建和组装进行了解耦(也就是分开);这样通过不同构建器,或者不同的组装顺序,都可以获得不同的对象(类似于产品);

2.简单使用

  1. 基本步骤记录(以创建电脑为例,只写入部分组件):
    1. 首先创建一个电脑类,其中定义好例如CPU,VideoCard,Power属性(其实这些属性都是类,也可以有自己的属性,比如电源可以有自己的品牌,有自己的风扇之类的);
    2. 接下来创建一个Builder接口,比如这里可以创建成ComputerBuilder接口,在里面创建一些方法(这里理解为用于创建三个属性的类的方法);
    3. 创建一个Director接口,这里可以创建为ComputerDirector接口,这个接口用于创建一个组装的的方法;
    4. 创建一个ComputerBuilder的实现类,实现这个接口的所有方法;
    5. 创建一个ComputerDirector的实现类,对这个接口中的方法进行实现;在这里面必须要有一个构建者的对象(比如:ComputerBuilder),因为需要先进行构建,再进行组合;同时返回一个成品;

具体程序如下:
第一个步骤:

//创建总的电脑类;
public class Computer {
  //定义电脑的部分组件类作为属性;
  private CPU cpu;
  private VideoCard videoCard;
  private Power power;

  //定义好各个属性的getter,setter方法

  public CPU getCpu() {
      return cpu;
  }

  public void setCpu(CPU cpu) {
      this.cpu = cpu;
  }

  public VideoCard getVideoCard() {
      return videoCard;
  }

  public void setVideoCard(VideoCard videoCard) {
      this.videoCard = videoCard;
  }

  public Power getPower() {
      return power;
  }

  public void setPower(Power power) {
      this.power = power;
  }
}

//在这里为各个属性类也进行定义,如果需要,这里也可以使用工厂模式进行合作使用,
class CPU {
  private String brand;

  public CPU(String brand) {
      this.brand = brand;
  }

  public String getBrand() {
      return brand;
  }

  public void setBrand(String brand) {
      this.brand = brand;
  }
      @Override
  public String toString() {
      return "brand=" + brand;
  }
}

class VideoCard {
  private String brand;

  public VideoCard(String brand) {
      this.brand = brand;
  }

  public String getBrand() {
      return brand;
  }

  public void setBrand(String brand) {
      this.brand = brand;
  }
}
//如果有多个属性也是可以写的;
class Power {
  private String brand;
  private String fan;

  public Power(String brand, String fan) {
      this.brand = brand;
      this.fan = fan;
  }

  public String getBrand() {
      return brand;
  }

  public void setBrand(String brand) {
      this.brand = brand;
  }

  public String getFan() {
      return fan;
  }

  public void setFan(String fan) {
      this.fan = fan;
  }
}

** 第二个步骤:**

//创建一个ComputerBuilder接口,
public interface ComputerBuilder {
   CPU createCPU();
   Power createPower();
   VideoCard createVideoCard();
}

第三个步骤:

//用于创建一个组装的方法;
public interface ComputerDirector {
 Computer directorALl();
}

第四个步骤:

//定义一个ComputerBuilder的实现类;
public class ChComput implements ComputerBuilder{
  @Override
  public CPU createCPU() {
      System.out.println("这是中国创造的CPU");
      return new CPU("Chinese Create");
  }

  @Override
  public Power createPower() {
      System.out.println("中国创造的电源");
      return new Power("Chinese Create", "有风扇");
  }

  @Override
  public VideoCard createVideoCard() {
      System.out.println("中国创造的显卡");
      return new VideoCard("Chinese Create");
  }
}

第五个步骤:

//这个是ComputerDirector的实现类
public class ChComputerDirector implements ComputerDirector{
    //这里由于是需要用到之前的一些属性类,所以需要有ComputerBuilder的实现类的对象,我们可以用多态来表示;
    private ComputerBuilder combuilder;

    //创建一个构造器将上面的对象传进来;
    public ChComputerDirector(ComputerBuilder combuilder) {
        this.combuilder = combuilder;
    }

    @Override
    public Computer directorALl() {
        //通过上面传进来的实现类创建CPU类的对象;
        CPU cpu = combuilder.createCPU();
        //创建电源对象
        Power power = combuilder.createPower();
        //创建显卡对象
        VideoCard videoCard = combuilder.createVideoCard();

        /*创建完三个基本的属性类对象,但是还是没有合成computer,
        * 这里还需要使用到Computer类里面的getter和setter方法;
        * */
        Computer computer = new Computer();
        computer.setCpu(cpu);
        computer.setPower(power);
        computer.setVideoCard(videoCard);
        //到这里就可以返回Computer对象了;
        return computer;
    }
}

最后一步:简单的测试一下

public class test {
    public static void main(String[] args) {
        //在这里定义了ComputerDirector类的对象
        ComputerDirector computerDirector = new ChComputerDirector(new ChComput());
        //这里就可以通过ComputerDirector的方法获得Computer类的对象,就已经相当于创建好了一台Computer
        Computer computer = computerDirector.directorALl();
        //你可以根据这个对象,获得各个Computer的其中的参数;比如电脑用了什么电源,用来说明CPU等等,还可以在电脑里面添加一些功能;
        System.out.println(computer.getCpu());
    }
}

测试结果:

猜你喜欢

转载自blog.csdn.net/dxsdcyy/article/details/107092109