建造模式

    建造模式将一个产品的内部表象与产品的生成过程分割开来,从而使一个建造过程可以生成具有不同内部表象的产品对象。

   1> 一个对象的某些属性必须按照某些顺序赋值才有意义,对象的某些属性必须赋值才能使用;

   2> 对象由多个零件构成,而零件的构造过程又较为复杂,这时建造模式就很适用。

    

    上面的类图中还需要加上一个Client,由Client生成不同的ConcratedBuilder并调用Director,在Director中使用不同的ConcratedBuilder生成具体的产品。

public Class Client{
    public void buildProduct(){
         Director director = new Director();
         
         Builder builder1 = new ConcratedBuilder1();
         Product p1 = director.construct(builder1);

         Builder builder2 = new ConcratedBuilder2();
         Product p1 = director.construct(builder2);
    }
}

  

     public class Director {

           public Product construct(Builder builder){

                 builder.buildPart1();
                 builder.buildPart2();
                 builder.retrieveProduct();
          }
}

  Director不知道调用哪个ConcreteBuilder生成对象,是由client调用construct方法传入ConcreteBuilder的。

public interface Builder {
	public abstract Object buildPart1();
	public abstract Object buildPart2();
	public abstract Product retrieveProduct();	
}

  

    public class ConcreteBuilder1 implements Builder {
         private Object part1,part2;
         @Override
         public Object buildPart1() {
               part1 = new Object();
               return part1;
         }

         @Override
         public Object buildPart2() {
              part2 = new Object();
              return part2;
         }

         @Override
         public Product retrieveProduct() {
              Product1 p = new Product1();
              return p;
         }
}

  

public interface Product {
	public abstract void function();
}

  

public class Product1 implements Product {
	
	@Override
	public void function() {
	}
}

   上面的类之间调用关系的流程图如下所示:

 

      只有1个具体的builder和product时,上面的建造模式可以简化如下:

     

      Builder兼任了Director和Builder双重的作用,直接生成具体的产品。

      

public class Builder {
         private Object part1,part2;
         public Object buildPart1() {
               part1 = new Object();
               return part1;
         }

         public Object buildPart2() {
              part2 = new Object();
              return part2;
         }

         public Product retrieveProduct() {	
              Product1 p = new Product1();
              return p;
         }

public Product construct(Builder builder){
             builder.buildPart1();                
             builder.buildPart2();                 
             builder.retrieveProduct();             

             }

}

  上面的简化了的建造模式还适用于女娲造人,类图如下:

  

      发送邮件也可以使用建造模式来实现,类图如下:

      

     建造模式与抽象工厂模式的区别:

           抽象工厂模式每次都直接生成一个完整的对象,而建造模式生成对象是一步步的,最后返回给客户端的是一个复杂的完整的对象。

     建造模式与策略模式的区别:

           建造模式的多个具体builder虽然拥有相同的接口,但是所创造的出的对象可能完全不同,只是最后返回的具体对象的一部分。策略模式        是为算法提供抽象的接口。不同的具体策略对象为一般性的服务提供不同的实现。

      

原文地址:https://www.cnblogs.com/lnlvinso/p/3807115.html