建造者模式

建造者模式(Builder Pattern)

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

介绍

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

● Product产品类

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

● Builder抽象建造者

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

● ConcreteBuilder具体建造者

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

● Director导演类

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

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

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

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

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

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

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

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

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

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

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

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

实现

步骤 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 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。

建造者模式与工厂模式的不同:

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

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

posted @ 2020-06-11 10:18  meigang  阅读(109)  评论(0编辑  收藏  举报