建造模式

建造模式是对象的创建模式,建造模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
在这个模式中,有四个角色;
        抽象建造者:给出一个抽象接扩口,以规范产品对象的各个组成成分的建造,一般而言,此接口独立于应用程序的商业逻辑,模式中直接创建产品对象的是具体建造者角色,具体建造者类必须实现这个接口所要求的两种方法,一种是建造方法,另一种是返还结构方法,一般而言,产品所包含的零件数目与建造方法的数目相符,换言之,有多少零件,就有多少相应的建造方法;
        具体建造者角色:担任这个角色的是与应用程序紧密相关的一些类,他们在应用程序调用下创建产品的实例,这个角色要完成的任务包括:1,实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2,在建造过程完成后,提供产品的实例;
        导演者角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色;
        产品角色:产品是建造中的复杂对象,一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的 接口,而完全可以是不相关联的;
我们可以举一个盖房子工程的例子来说明:我们知道,盖一个房子要的角色有盖房子的各种各样的材料,一个盖房子的工人,还要有一个负责设计的工程师,我们先来说一下各自的特点,作为一个工人,他知道如何去盖厕所,盖大厅,知道怎么具体地使用这些材料,但是,他不具备设计的能力,因为他不会画那些设计图纸,而作为工程师来说,他负责指挥工人去按他所设计的图纸去盖房子,但是他并不知道怎么具体地使用这些材料,因为他不必下工地,没有那些工人的经验老道,这样的话,下次你依然可以用这些相同的材料去盖出不同风格的房子出来,这里还可以有一个房子的主人的角色,他的任务是雇包工头,并给包工头指派了工人,还有材料,然后让包工头自己去负责设计,自己只要最后得到这个房子就可以了。这就是建造者模式。下面是代码;
首先是产品类;
package Build;

public class Product {

      public Product() {
            // TODO Auto-generated constructor stub
      }

      private String part1;
      private String part2;
      public String getPart1() {
            return part1;
      }
      public void setPart1(String part1) {
            this.part1 = part1;
      }
      public String getPart2() {
            return part2;
      }
      public void setPart2(String part2) {
            this.part2 = part2;
      }
      
}

  建造者抽象类;

package Build;

public interface Builder {

      public void buildPart1();
      public void buildPart2();
      public Product retrieveResult();
}

  具体建造者类;

package Build;

public class ConcreteBuilder implements Builder{

      public ConcreteBuilder() {
            // TODO Auto-generated constructor stub
      }
      
      private Product product = new Product();
      @Override
      public void buildPart1(){
            product.setPart1("编号:9527");
      }
      @Override
      public void buildPart2(){
            product.setPart2("名称:XXX");
      }
      @Override
      public Product retrieveResult(){
            return product;
      }
}

  导演者类;

package Build;

public class Director {

      public Director() {
            // TODO Auto-generated constructor stub
      }
      private Builder builder;
      public Director(Builder builder){
            this.builder = builder;
      }

      public void construct(){
            builder.buildPart1();
            builder.buildPart2();
      }
}

  客户端类;

package Build;

public class Client {

      public Client() {
            // TODO Auto-generated constructor stub
      }

      public static void main(String[] args){
            Builder builder = new ConcreteBuilder();
            Director director = new Director(builder);
            director.construct();
            Product product = builder.retrieveResult();
            System.out.println(product.getPart1());
            System.out.println(product.getPart2());
      }
}

  

posted on 2018-03-19 09:30  楚大校  阅读(168)  评论(0编辑  收藏  举报

导航