Fork me on GitHub

设计模式-建造者模式(05)

定义

  建造者模式(Builder Pattern)也叫做生成器模式。英文原话是:Separate the construction of a complex object from its representation so that the same construction process can create different representations.意思是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

UML图

代码

在建造者模式中,可以分为四个角色:

  1.抽象建造者(Builder)角色:该角色用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑。
  2.具体建造者(Concrete Builder)角色:该角色实现抽象建造者中定义的所有方法,并且返回一个组建好的产品实例。
  3.产品(Product)角色:该角色是建造中的复杂对象,一个系统中会有多个产品类,这些产品类并不一定有共同的接口,可以是完全不相关联的。
  4.导演者(Director)角色:该角色负责安排已有模块的顺序,然后告诉Builder开始建造。

/**
 * 抽象建造者角色(Builder)
 * 规范产品的组成部分
 */
public abstract class Builder {
    //设置产品的部分部分,以获得不同的产品
    public abstract void setPart1();
    public abstract void setPart2();
    public abstract void setPart3();
    //...更多部件限制
    //建造产品
    public abstract Product builderProduct();
}

/**
 * 具体建造者(Concrete Builder)
 * 实现建造者中定义的方法,并且返回一个组建好的产品实例.
 */
public class ConcreteBuilder extends Builder {
    private Product product = new Product();
    //设置产品零件
    @Override
    public void setPart1() {
        //为product产品安装部件1
    }
    @Override
    public void setPart2() {
        //为product产品安装部件2
    }
    @Override
    public void setPart3() {
        //为product产品安装部件3
    }
    //...其他部件
    //建造一个产品
    @Override
    public Product builderProduct() {
        return product;
    }
}

/**
 * 产品角色(Product)
 * 一个建造者模式可以有多个产品,并且可以是完全不相关联的
 */
public class Product {
    //产品类的业务处理方法
}

/**
 * 导演者角色(Director)
 * 负责调用具体建造者的方法,告诉Builder开始建造
 */
public class Director {
    private Builder builder = new ConcreteBuilder();
    //构造产品,负责调用各个零件构造方法
    public Product build(){
        builder.setPart1();
        builder.setPart2();
        builder.setPart3();
        //...其他部件
        return builder.builderProduct();
    }
}

源码

建造者模式的优点

  1.封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。
  2.建造者独立,容易拓展。
  3.便于控制细节风险。由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他模块产生任何影响。

建造者模式的使用场景

  1.当采用相同的方法,不同的执行顺序,产生不同的结果时,可以采用建造者模式实现。
  2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
  3.当产品类非常复杂,或者产品类中的方法调用顺序不同产生了不同的效能时,使用建造者模式。
  4.当在对象创建过程中会使用到系统的一些其他对象,而这些对象在产品的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。这种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段没有发现,却要通过建造者封装创建过程,本身已经违反设计的最初目标。

建造者模式关注的是零件类型和转配工艺顺序,这是它与工厂方法模式最大的不同之处,虽然同为创建类模式,但是重点不同。

/**
 * 抽象产品类
 * 共同的数据类型,继承用
 */
public abstract class CellPhone {
    private String cpu;    //CPU型号
    private String ram;    //内存
    private String screen;    //屏幕
    private String battery;    //电池
    private String facade;    //外观
    private String others;    //其他部件
}

/**
 * Mate7产品类,基本数据类型由继承父类来
 */
public class Mate7 extends CellPhone{
    public Mate7() {
        System.out.println("这是华为Meta7手机");
    }
    
    public String toString(){
        return "配置\nCPU:"+this.getCpu()+"\n内存:"+this.getRam()+"\n屏幕大小:"
                +this.getScreen()+"\n电池容量:"+this.getBattery()+"\n外观:"
                +this.getFacade()+"\n其他功能:"+this.getOthers();
    }
}

/**
 * Mate7产品类,基本数据类型由继承父类来
 */
public class Mx4Pro extends CellPhone {
    public Mx4Pro() {
        System.out.println("这是华为Mx4Pro手机");
    }
    
    public String toString(){
        return "配置\nCPU:"+this.getCpu()+"\n内存:"+this.getRam()+"\n屏幕大小:"
                +this.getScreen()+"\n电池容量:"+this.getBattery()+"\n外观:"
                +this.getFacade()+"\n其他功能:"+this.getOthers();
    }
}


/**
 * 抽象建造者(Builder)
 * 规范手机的各个组成部分,具体如何组成由具体实现类决定
 */
public interface CellPhoneBuilder {
    public void buildCPU();
    public void buildRAM();
    public void buildScreen();
    public void buildBattery();
    public void buildFacade();
    public void buildOthers();
    public CellPhone getPhone();
}

/**
 * Mate7具体建造者(Concrete Builder)
 * 实现抽象建造者方法
 */
public class Mate7Build implements CellPhoneBuilder {
    CellPhone mate7 = new Mate7();
    @Override
    public void buildCPU() {
        mate7.setCpu("华为研发的芯片");
    }

    @Override
    public void buildRAM() {
        mate7.setRam("3G内存");
    }

    @Override
    public void buildScreen() {
        mate7.setScreen("六寸高清屏");
    }

    @Override
    public void buildBattery() {
        mate7.setBattery("4100毫安大容量电池");
    }

    @Override
    public void buildFacade() {
        mate7.setFacade("琥珀金");
    }

    @Override
    public void buildOthers() {
        mate7.setOthers("后背指纹识别");
    }

    @Override
    public CellPhone getPhone() {
        return mate7;
    }

}

/**
 * Mx4Pro具体建造者(Concrete Builder)
 * 实现抽象建造者方法
 */
public class Mx4ProBuild implements CellPhoneBuilder{
    CellPhone mx4 = new Mx4Pro();
    @Override
    public void buildCPU() {
        mx4.setCpu("三星的CPU");
    }

    @Override
    public void buildRAM() {
        mx4.setRam("3G内存");
    }

    @Override
    public void buildScreen() {
        mx4.setScreen("五点五寸2K高清屏");
    }

    @Override
    public void buildBattery() {
        mx4.setBattery("3300毫安大容量电池");
    }

    @Override
    public void buildFacade() {
        mx4.setFacade("土豪金");
    }

    @Override
    public void buildOthers() {
        mx4.setOthers("360度指纹识别");
    }

    @Override
    public CellPhone getPhone() {
        return mx4;
    }
}



/**
 * 导演者(Director)
 * 负责安排构建的顺序
 */
public class CellPhoneDirector {
    private CellPhoneBuilder cellPhoneBuilder = null;
    
    public Mate7 buildMate7() {
        cellPhoneBuilder = new Mate7Build();
        cellPhoneBuilder.buildCPU();
        cellPhoneBuilder.buildRAM();
        cellPhoneBuilder.buildScreen();
        cellPhoneBuilder.buildBattery();
        cellPhoneBuilder.buildFacade();
        cellPhoneBuilder.buildOthers();
        return (Mate7) cellPhoneBuilder.getPhone();
    }
    
    public Mx4Pro buildMx4Pro(){
        cellPhoneBuilder = new Mx4ProBuild();
        cellPhoneBuilder.buildCPU();
        cellPhoneBuilder.buildRAM();
        cellPhoneBuilder.buildScreen();
        cellPhoneBuilder.buildBattery();
        cellPhoneBuilder.buildFacade();
        cellPhoneBuilder.buildOthers();
        return (Mx4Pro) cellPhoneBuilder.getPhone();
    }
}


/**
 * 测试类,直接调用导演类获得实例,内部如何建造对外封装
 */
public class CellPhoneDemo {
    public static void main(String[] args) {
        CellPhoneDirector director = new CellPhoneDirector();
        System.out.println("构建Mate7");
        Mate7 mate7 = director.buildMate7();
        System.out.println(mate7);    //查看详情
        System.out.println("构建Mx4Pro");
        Mx4Pro mx4Pro = director.buildMx4Pro();
        System.out.println(mx4Pro);    //查看详情
    }

}

源码

posted @ 2017-11-17 12:43  秋夜雨巷  阅读(303)  评论(0编辑  收藏  举报