每天一种设计模式:构建器模式(Builder)

                                    每天一种设计模式:构建器模式(Builder)


                                    构建模式是对象的创建模式。构造模型将产品的内部表示与产品的生产过程分开,允许构建过程生成具有不同内部表示的产品对象。 (1)。产品的内部外观 产品通常具有不同的组件作为产品的一部分。这些部分可能是也可能不是对象。它们通常被称为产品的内部表示。 (ⅱ)。构建对象的本质 在某些情况下,对象具有一些重要属性,并且在正确分配对象之前,该对象不能用作完整产品。例如,电子邮件具有发件人地址,收件人地址,主题,内容,附件等,并且在分配最基本的发件人地址之前不能发送电子邮件。 在某些情况下,必须按特定顺序分配对象的某些属性才有意义。在分配属性之前,无法分配另一个属性。 这些条件使得自然本身的构建成为复杂的业务逻辑。设置后,此对象等同于要构建的产品,对象的这些属性等同于产品的各个部分,构建产品的过程就是构建部件的过程。 由于构建零件的过程很复杂,因此这些零件的构造通常会外部化为另一个成为构件的对象。构建器对象返回到客户端是一个产品对象,其中包含所有部件。 施工方式结构 在该示意图系统中,最终产品Product仅包含两个部分,part1和part2。还有两个相应的构造函数,buildPart1()和buildPart2()。 同时,我们可以看到这种模式涉及四个角色,即: 抽象生成器: 给出了一个抽象接口来规范产品对象的各种组件的构造。模式中产品对象的真实创建是具体构建器ConcreteBuilder角色。 具体构建器类必须实现此接口所需的两个方法: 通常,产品中包含的零件数量与构造方法的数量相匹配。换句话说,需要构建多少部件以及有多少构造方法。 Concrete Builder(ContreteBuilder): 在此角色中是在特定业务场景下构造抽象构建器。该角色要完成的任务包括: 主任(主任): 扮演此角色的类调用具体构建器角色来创建产品对象。应该注意的是,导演的角色没有产品类别的具体知识。产品类的特定知识是特定的构建器角色。 产品: 产品是建筑中的复杂对象。通常,系统中将有多个产品类,并且这些产品类不一定具有公共接口,但可能完全不相关。 构建模式的示例代码 Product.java 公共类产品{ /** *产品零件 * / 私人字符串第1部分; 私人字符串第2部分; Public String getPart1(){ 返回第1部分; } Public void setPart1(String part1){ This.part1=part1; } Public String getPart2(){ 返回第2部分; } Public void setPart2(String part2){ This.part2=part2; } @覆盖 Public String toString(){ 返回'Product [part1='+ part1 +',part2='+ part2 +']'; } } Builder.java /** *抽象建设者角色 * *提供零件构造方法和返回结果方法 * / 公共接口Builder { Void buildPart1(); Void buildPart2(); 产品retrieveResult(); } ConcreteBuilder.java /** *具体的建设者角色 * / 公共类ConcreteBuilder实现Builder { 私人产品=新产品(); /** *零件的构造1 * / @覆盖 Public void buildPart1(){ product.setPart1('part class 1,number:10000'); } /** *零件的构造2 * / @覆盖 Public void buildPart2(){ product.setPart2('Part Class 2,Number:20000'); } /** *施工后返回成功产品 * @return * / @覆盖 公共产品retrieveResult(){ 退货; } } Director.java /** *董事角色 * / 公共类主任{ /** *创建构建器对象 * / 私人建筑商; /** *构造函数,给定构建器对象 * @param构建器构建器对象 * / Public Director(构建器构建器){ This.builder=builder; } /** *产品构造方法,其中调用产品部件构造方法。 * / 公共产品构造(){ builder.buildPart1(); builder.buildPart2(); //返回构建器构建的产品对象 返回builder.construct(); } } Client.java 公共类Client { Public static void main(String [] args){ //创建一个特定的构建器对象 Builder builder=new ConcreteBuilder(); //给定构建器对象,创建一个director角色 董事总经理=新董事(建筑师); //调用导演角色以创建产品部件。并返回产品结构。 产品产品=director.construct(); 的System.out.println(产品); } } 完成上述代码的具体步骤: 构建器模式构建复杂对象 考虑到这样的实际业务应用,创建了保险合同的对象,其中许多属性的值受到约束,并且创建的对象需要满足这些约束规则。 约束规则如下: 具体实施思路如下: 因此,构建器可以被抽象到目标产品的内部,因此最大的好处是从外部屏蔽特定的构建实现。示例代码如下: InstranceContract.java /** *保险合同号 * / 公共类InstranceContract { /** *保险合同号 * / Private String contractId; /** *被保险人的姓名,这里有限制:要么与个人签约,要么与公司签约 *换句话说,保险名称属性和保险公司名称属性不能同时具有值。 * / Private String personName; /** *保险公司名称 * / Private String companyName; /** * 起始时间 * / 私人长期开始日期; /** *结束时间,需要大于开始时间 * / 私人长期日期; /** *其他数据 * / Private String otherData; Private InstranceContract(ConcreteBuilder builder){ this.contractId=builder.contractId; this.personName=builder.personName; this.companyName=builder.companyName; this.beginDate=builder.beginDate; this.endDate=builder.endDate; this.otherData=builder.otherData; } /** *保险合同的一些操作 * / Public void someOperation(){ System.out.println('当前保险合同号是['+ this.contractId +']'); 的System.out.println(本); } @覆盖 Public String toString(){ 返回'InstranceContract [contractId='+ contractId + ',personName='+ personName + ',companyName='+ companyName + ',beginDate='+ beginDate + ',endDate='+ endDate + ',otherData='+ otherData + ']'; } 公共静态类ConcreteBuilder { Private String contractId; Private String personName; Private String companyName; 私人长期开始日期; 私人长期日期; Private String otherData; /** *施工方法 * @param contractId保险合同号 * @param beginDate生效时间 * @param endDate到期时间 * / Public ConcreteBuilder(String contractId,long beginDate,long endDate){ this.contractId=contractId; this.beginDate=beginDate; this.endDate=endDate; } Public ConcreteBuilder setPersonName(String personName){ this.personName=personName; 归还这个; } Public ConcreteBuilder setCompanyName(String companyName){ this.companyName=companyName; 归还这个; } Public ConcreteBuilder setOtherData(String otherData){ this.otherData=otherData; 归还这个; } Public InstranceContract build(){ if(contractId==null || contractId.trim()。length()==0){ 抛出新的IllegalArgumentException('合同号不能为空'); } Boolean signPerson=(personName!=null && personName.trim()。length()> 0); Boolean signCompany=(companyName!=null && companyName.trim()。length()> 0); 如果(signPerson && signCompany){ 抛出新的IllegalArgumentException('保险合同不能与个人和公司签订'); } 如果(!signPerson &&!signCompany){ 抛出新的IllegalArgumentException('没有对象就不能签署保险合同'); } 如果(beginDate

                                    上一篇:美国宇航局将把你的名字带到火星,施瓦辛格回到终结者的新工作直男日报

                                    下一篇:在军队中获得第一名,“法山山地英雄”是牛

                                    相关推荐:全新宝马3系预售从31.19万元,网友大喊“价格有点高!” | 施乐曾多次败下阵来,为什么会成为国名呢?金怀娣说成功或失败的关键 | 全新宝马3系预售从31.19万元,网友大喊“价格有点高!”

                                    评论

                                    您的邮箱地址不会被公布 *

                                    您可以使用这些html标签 <a href="#" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>