创建型模式————建造者模式(2.4)

  • 2019 年 10 月 6 日
  • 筆記

什么是建造者模式?

工厂模式聚焦于创建出一个对象,而建造者除此之外还需要为创建的对象赋值。

简单来说,建造者模式=创建对象+属性赋值。

建造者模式应用场景

建造者模式适合创建类中包含多个参数且需要定制化的情况。

简单来说,建造者模式的目的就是创造一条龙服务:不仅创建出对象,顺便给属性赋值。

以计算机为例,计算机的性能大致由CPU,显卡,内存,硬盘这几个属性构成。

市面上更多的是已经组装好的成品,而不会让用户自己去配一台电脑出来。(当然自己也是可以配的)

市场根据需求分为游戏本,办公本以及娱乐本等等。不同的种类性能是不一样的。但会在一个大致的范畴。

如果将所有的CPU,显卡,硬盘等等排列组合,电脑的种类将难以计数。所以官方推出定制本不仅缩小了选择的难度。也提供了生产的方便。

写个Demo实现:

虚线以上可以理解为服务端,一下可以理解为客户端。

那么生产一个产品的流程大致是这样的:实例化一个建造者实现类和一个指挥者装配类,调用指挥者转配类中的build方法实现建造者实现类的setter方法从而达到实例化产品的目的。

为什么需要建造者接口类和建造者实现类?

接口类控制的是产品的生产标准(实例化标准),每一个具体的产品都需要实现该接口完成产品创建。

优点:提升了扩展性。(客户端也可以通过接口的实现来创建自定义产品)

为什么需要指挥者装配类?

调用建造者实用类的setter方法即可完成产品的实例化创建,但这一部分对于每一个产品来说都是相同的。

那么在实例化产品的过程中,完全可以把这个重复且无任何变化的过程封装起来。实现代码复用。

class Computer  //产品类  {      private String cpu;      private String gpu;      private String memory;      private String hardpan;        public String getCpu() {          return cpu;      }        public void setCpu(String cpu) {          this.cpu = cpu;      }        public String getGpu() {          return gpu;      }        public void setGpu(String gpu) {          this.gpu = gpu;      }        public String getMemory() {          return memory;      }        public void setMemory(String memory) {          this.memory = memory;      }        public String getHardpan() {          return hardpan;      }        public void setHardpan(String hardpan) {          this.hardpan = hardpan;      }        @Override      public String toString() {          return "Computer{" +                  "cpu='" + cpu + ''' +                  ", gpu='" + gpu + ''' +                  ", memory='" + memory + ''' +                  ", hardpan='" + hardpan + ''' +                  '}';      }  }    interface ComputerBuilder    //建造者接口类  {      void setCpu();      void setGpu();      void setMemeory();      void setHardpan();      Computer build();  }    class Hp_Game implements ComputerBuilder   //建造者实现类  {      private Computer computer=new Computer();          @Override      public void setCpu() {          computer.setCpu("i7 8300");      }        @Override      public void setGpu() {          computer.setGpu("rtx1080i");      }        @Override      public void setMemeory() {          computer.setMemory("32g");      }        @Override      public void setHardpan() {          computer.setHardpan("500G m2");      }        @Override      public Computer build() {          return computer;      }  }    class Hp_Work implements ComputerBuilder  {      private Computer computer=new Computer();          @Override      public void setCpu() {          computer.setCpu("i6 7300");      }        @Override      public void setGpu() {          computer.setGpu("MX250");      }        @Override      public void setMemeory() {          computer.setMemory("4g");      }        @Override      public void setHardpan() {          computer.setHardpan("500G SATA");      }        @Override      public Computer build() {          return computer;      }  }    class ComputerDirector   //指挥者装配类  {      public Computer build(ComputerBuilder cb)      {          cb.setCpu();          cb.setGpu();          cb.setMemeory();          cb.setHardpan();            return cb.build();      }  }      //=============================  public class APPlication  {        public static void main(String[] args) {          Hp_Game hp01 = new Hp_Game();          Hp_Work hp02 = new Hp_Work();              ComputerDirector computerDirector = new ComputerDirector();            Computer computer_hp1=computerDirector.build(hp01);          System.out.println(computer_hp1);            Computer computer_hp02 =computerDirector.build(hp02);          System.out.println(computer_hp02);        }  }

客户端扩展一个产品实例

定义一个建造者实现类实现建造者接口类,并完成setter定制即可。

class Computer  //产品类  {      private String cpu;      private String gpu;      private String memory;      private String hardpan;        public String getCpu() {          return cpu;      }        public void setCpu(String cpu) {          this.cpu = cpu;      }        public String getGpu() {          return gpu;      }        public void setGpu(String gpu) {          this.gpu = gpu;      }        public String getMemory() {          return memory;      }        public void setMemory(String memory) {          this.memory = memory;      }        public String getHardpan() {          return hardpan;      }        public void setHardpan(String hardpan) {          this.hardpan = hardpan;      }        @Override      public String toString() {          return "Computer{" +                  "cpu='" + cpu + ''' +                  ", gpu='" + gpu + ''' +                  ", memory='" + memory + ''' +                  ", hardpan='" + hardpan + ''' +                  '}';      }  }    interface ComputerBuilder    //建造者接口类  {      void setCpu();      void setGpu();      void setMemeory();      void setHardpan();      Computer build();  }    class Hp_Game implements ComputerBuilder   //建造者实现类  {      private Computer computer=new Computer();          @Override      public void setCpu() {          computer.setCpu("i7 8300");      }        @Override      public void setGpu() {          computer.setGpu("rtx1080i");      }        @Override      public void setMemeory() {          computer.setMemory("32g");      }        @Override      public void setHardpan() {          computer.setHardpan("500G m2");      }        @Override      public Computer build() {          return computer;      }  }    class Hp_Work implements ComputerBuilder  {      private Computer computer=new Computer();          @Override      public void setCpu() {          computer.setCpu("i6 7300");      }        @Override      public void setGpu() {          computer.setGpu("MX250");      }        @Override      public void setMemeory() {          computer.setMemory("4g");      }        @Override      public void setHardpan() {          computer.setHardpan("500G SATA");      }        @Override      public Computer build() {          return computer;      }  }    class ComputerDirector   //指挥者,复制给属性赋值  {      public Computer build(ComputerBuilder cb)      {          cb.setCpu();          cb.setGpu();          cb.setMemeory();          cb.setHardpan();            return cb.build();      }  }      //=============================    class Dell_Game implements ComputerBuilder  {      private Computer computer=new Computer();          @Override      public void setCpu() {          computer.setCpu("i7 9300");      }        @Override      public void setGpu() {          computer.setGpu("GTX1090");      }        @Override      public void setMemeory() {          computer.setMemory("32g");      }        @Override      public void setHardpan() {          computer.setHardpan("500G m2");      }        @Override      public Computer build() {          return computer;      }  }    public class APPlication  {        public static void main(String[] args) {  //        Hp_Game hp01 = new Hp_Game();  //        Hp_Work hp02 = new Hp_Work();              ComputerDirector computerDirector = new ComputerDirector();    //        Computer computer_hp1=computerDirector.build(hp01);  //        System.out.println(computer_hp1);  //  //        Computer computer_hp02 =computerDirector.build(hp02);  //        System.out.println(computer_hp02);            Dell_Game dell_game = new Dell_Game();          Computer computer_Dell_game = computerDirector.build(dell_game);          System.out.println(computer_Dell_game);              }  }

小结

建造者模式的目的是创建对象并给属性赋值;

换个角度思考,实现接口的建造者实现类在定义的时候就是为了实现产品类的(而具体的产品类是固定的)。所以这个类本身的目的就是为了实例化另外一个类。而指挥者通过调用这个类的setter方法完成对产品类的属性赋值。

建造者模式的核心目的是创建出带有实例化属性的对象,而且有良好的扩展性。(符合开闭原则)

建造者要建造啥——开箱即用的产品。