建造者模式

建造者模式(Builder Pattern)

定义:Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。)html

介绍

意图:将一个复杂的构建与其表示相分离,使得一样的构建过程能够建立不一样的表示。算法

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的建立工做,其一般由各个部分的子对象用必定的算法构成;因为需求的变化,这个复杂对象的各个部分常常面临着剧烈的变化,可是将它们组合在一块儿的算法却相对稳定。app

● Product产品类ide

一般是实现了模板方法模式,也就是有模板方法和基本方法,例子中的BenzModel和BMWModel就属于产品类。测试

● Builder抽象建造者ui

规范产品的组建,通常是由子类实现。例子中的CarBuilder就属于抽象建造者。spa

● ConcreteBuilder具体建造者code

实现抽象类定义的全部方法,而且返回一个组建好的对象。例子中的BenzBuilder和BMWBuilder就属于具体建造者。htm

● Director导演类对象

负责安排已有模块的顺序,而后告诉Builder开始建造

建造者(Builder)模式的主要角色以下。

  1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来建立其各个滅部件。
  2. 抽象建造者(Builder):它是一个包含建立产品各个子部件的抽象方法的接口,一般还包含一个返回复杂产品的方法 getResult()。
  3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体建立方法。
  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的建立,在指挥者中不涉及具体产品的信息。

什么时候使用:一些基本部件不会变,而其组合常常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:建立和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例: 一、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是常常变化的,生成出所谓的"套餐"。 二、JAVA 中的 StringBuilder。

优势: 一、建造者独立,易扩展。 二、便于控制细节风险。

缺点: 一、产品必须有共同点,范围有限制。 二、如内部变化复杂,会有不少的建造类。

使用场景: 一、须要生成的对象具备复杂的内部结构。 二、须要生成的对象内部属性自己相互依赖。

● 相同的方法,不一样的执行顺序,产生不一样的事件结果时,能够采用建造者模式。

● 多个部件或零件,均可以装配到一个对象中,可是产生的运行结果又不相同时,则可使用该模式。

● 产品类很是复杂,或者产品类中的调用顺序不一样产生了不一样的效能,这个时候使用建造者模式很是合适。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

实现

步骤 1(产品角色)

/*
产品类

 */
//建造者模式
public class Product {


  private String cpu;
  private String memory;



}

步骤 2(抽象建造者(Builder))

/*
抽象建造类
 */
public  abstract   class Builder  {

    protected  Product product=new Product();

    public abstract void buildCPU();
    public Product  CreateProduct() {
        return product;
    }
}

步骤 3 ConcerteBuilder类——具体建造者类 ConcerteBuilder2类——具体建造者类(具体建造者(Concrete Builder))

/*
ConcerteBuilder类——具体建造者类
 */
public class ConcreteBuilder extends Builder {
    @Override
    public void buildCPU() {

        System.out.println("i5");
    }
}
/*
ConcerteBuilder2类——具体建造者类
 */
public class ConcreteBuilder2 extends Builder {

    @Override
    public void buildCPU() {
        System.out.println("i7");
    }
}

步骤 4(指挥者(Director))

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

    public  Product Concrete(Builder builder)
    {
        Product product;
        product=builder.CreateProduct();
        builder.buildCPU();
        return product;
    }
}

步骤 5

/*
建造者模式(Builder Pattern)
客户端测试
 */
public class  BuilderPetternDescription {

     public static void main(String[] arg)
     {

         Director director=new Director();

         Builder builder=new ConcreteBuilder();
         Product products=director.Concrete(builder);

         Builder  builder2=new ConcreteBuilder2();
         Product product=director.Concrete(builder2);
     }
}
 
结果:

i5
i7

 

咱们假设一个快餐店的商业案例,其中,一个典型的套餐能够是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)能够是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)能够是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。

咱们将建立一个表示食物条目(好比汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。

建造者模式与工厂模式的不一样:

建造者模式最主要的功能是基本方法的调用顺序安排,这些基本方法已经实现了,顺序不一样产生的对象也不一样;

工厂方法则重点是建立,建立零件是它的主要职责,组装顺序则不是它关心的。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息