设计模式-建造者模式(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); //查看详情 } }