建造者模式
建造者模式定义及优缺点
建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
优点:封装性好,构建和表示分离。扩展性好,各个具体的建造者相互独立,有利于系统的解耦。客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
缺点:产品的组成部分必须相同,这限制了其使用范围。如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。为什么要使用建造者模式packagecom。jmmq。load。jim。designpatterns。buildpattern;Author:jimmyDate:202182919:20Description:常规实例化实体类一般如下写。这种写法的问题1、如果只使用构造器来构造实例,那么构造器要写很多。在使用的时候要一个一个去对2、如果使用setter来设值时则在程序在运行时可能无法确定这个实例中有哪些属性。这种情况可以考虑使用建造者模式来处理publicclassCarNormal{必须的组件发动机privateStringengine;轮胎privateStringshoe;地盘privateStringbaseplate;车架privateStringcarframe;。。。可选组件音箱privateStringaudio;倒车影像privateintvehicleBackupCamera;。。。全参publicCarNormal(Stringengine,Stringshoe,Stringbaseplate,Stringcarframe,Stringaudio,intvehicleBackupCamera){this。engineengine;this。shoeshoe;this。baseplatebaseplate;this。carframecarframe;this。audioaudio;this。vehicleBackupCameravehicleBackupCamera;}必选参数publicCarNormal(Stringengine,Stringshoe,Stringbaseplate,Stringcarframe){this。engineengine;this。shoeshoe;this。baseplatebaseplate;this。carframecarframe;}publicCarNormal(){}其他参数列表的构造器。。。gettersetter}优化1
我们优化一下来看看下面代码:Author:jimmyDate:202182919:34Description:builder模式:一种对象的创建模式这种模式的方式是使用内部类来隐藏外部类的具体初始化逻辑,提供对应的方法来在初始化的时候设置属性值。这种模式因为加载的东西很多,所以相对会影响性能。在未来可能会对类进行扩展属性的时候可以考虑是否使用这种方式publicclassCar{必须的组件发动机privateStringengine;轮胎privateStringshoe;地盘privateStringbaseplate;车架privateStringcarframe;。。。可选组件音箱privateStringaudio;倒车影像privateintvehicleBackupCamera;。。。public内部类,内部属性和外部一致publicstaticclassCarBuilder{必须的组件发动机privateStringengine;轮胎privateStringshoe;地盘privateStringbaseplate;车架privateStringcarframe;。。。可选组件音箱privateStringaudio;倒车影像privateintvehicleBackupCamera;。。。多种构造器publicCarBuilder(){}publicCarBuilder(Stringengine,Stringshoe,Stringbaseplate,Stringcarframe){this。engineengine;this。shoeshoe;this。baseplatebaseplate;this。carframecarframe;}publicCarBuilder(Stringengine,Stringshoe,Stringbaseplate,Stringcarframe,Stringaudio,intvehicleBackupCamera){this。engineengine;this。shoeshoe;this。baseplatebaseplate;this。carframecarframe;this。audioaudio;this。vehicleBackupCameravehicleBackupCamera;}publicCarBuilderaudio(Stringaudio){this。audioaudio;returnthis;}提供获取外部类方法publicCarbuild(){returnnewCar(this);}}私有化构造方法,并且构造器中传入内部的构造类privateCar(CarBuilderbuilder){enginebuilder。engine;shoebuilder。shoe;。。。}测试publicstaticvoidmain(String〔〕args){CarcarnewCar。CarBuilder()。audio(车载音响)。。。。build();}}建造者模式
将创建实例抽象建模。要获取一个对象的实例,把对象看作一个产品,那么就有一个产品类product产品是具有多种形态的,因此需要有一些继承product的子产品建造产品就需要一个建造者builder同样对应产品的多种形态,因此建造者也就需要多个类因为想要隐藏建造的过程,因此我们也需要一个代理的类来控制建造过程
所以整体上也就分为产品类、建造者类、指挥者(导演者)这三个角色(有的人会把建造者分为抽象建造者和真实建造者)
showcode
产品产品类publicabstractclassPerson{protectedStringhead;protectedStringbody;protectedStringfoot;publicStringgetHead(){returnhead;}publicvoidsetHead(Stringhead){this。headhead;}publicStringgetBody(){returnbody;}publicvoidsetBody(Stringbody){this。bodybody;}publicStringgetFoot(){returnfoot;}publicvoidsetFoot(Stringfoot){this。footfoot;}}子类产品1publicclassManextendsPerson{publicMan(){System。out。println(createaman);}OverridepublicStringtoString(){returnMan{};}}子类产品2publicclassWomanextendsPerson{publicWoman(){System。out。println(createaWoman);}OverridepublicStringtoString(){returnWoman{};}}
建造者抽象建造者publicabstractclassPersonBuilder{建造部件publicabstractvoidbuildHead();publicabstractvoidbuildBody();publicabstractvoidbuildFoot();publicabstractPersoncreatePerson();}具体建造者publicclassManBuilderextendsPersonBuilder{privatePersonperson;publicManBuilder(){this。personnewMan();}OverridepublicvoidbuildHead(){person。setHead(BraveHead);}OverridepublicvoidbuildBody(){person。setBody(Strongbody);}OverridepublicvoidbuildFoot(){person。setFoot(powfulfoot);}OverridepublicPersoncreatePerson(){returnperson;}}具体建造者2publicclassWomanBuilderextendsPersonBuilder{privatePersonperson;publicWomanBuilder(){this。personnewWoman();}OverridepublicvoidbuildHead(){person。setHead(PrettyHead);}OverridepublicvoidbuildBody(){person。setBody(softbody);}OverridepublicvoidbuildFoot(){person。setFoot(longwhitefoot);}OverridepublicPersoncreatePerson(){returnperson;}}
指挥者导演者publicclassDirector{publicPersonbuildPerson(PersonBuilderpb){pb。buildHead();pb。buildBody();pb。buildFoot();returnpb。createPerson();}clientcalltest客户端调用测试测试publicstaticvoidmain(String〔〕args){System。out。println(createDirector);DirectordirectornewDirector();Personp1director。buildPerson(newManBuilder());System。out。println(p1);System。out。println();Personp2director。buildPerson(newWomanBuilder());System。out。println(p2);}}runresultcreateDirectorcreateamanMan{headBraveHead,bodyStrongbody,footpowfulfoot}createaWomanWoman{headPrettyHead,bodysoftbody,footlongwhitefoot}
为什么有人说全世界只有中国需要双卡手机?为什么有人说全世界只有中国需要双卡手机?看到这个问题,我首先想到的是:先问是不是,再问为什么?我咨询了下身在国外的朋友以及外国朋友得出结论:基本上是正确……
请立即将您的iPhone更新到iOS14。8Apple已经发布了一套适用于iOS、macOS和watchOS的新更新,以修复一个漏洞,CitizenLab的安全研究人员表示,该漏洞很可能被利用以允许政府机构将间谍软件安装……
京东腾讯入股也救不了永辉,一年时间市值仅剩三分之一如果不是永辉官宣创始人张氏兄弟签署了《关于解除一致行动的协议》,谁也不会想到曾经携手打江山的兄弟二人,竟会闹到水火不容的地步。据天眼查资料显示,两兄弟对立后,原本第一大股……
因特网和互联网有什么区别?Internet,中文叫做因特网,它是有那些使用公用语言互相通信的计算机连接而成的网络,我们的计算机只要连接到它们的任何一个节点就意味着我们的计算机已经连入到Internet网……
全国首个5G无人氦气飞艇在云南试飞成功图为5G彩云一号无人飞艇。何淑亭摄中新网楚雄9月11日电(何淑亭)10日,中国移动云南公司联合北京航空航天大学云南创新研究院、华为技术有限公司共同研发的5G彩云一号无人飞……
江西省教育厅与腾讯公司签署战略合作框架协议来源:江西日报江西新闻客户端江西新闻客户端讯(江西日报记者蔡颖辉)8月26,江西省教育厅在南昌分别与中国电信江西公司、深圳腾讯公司签署战略合作框架协议,在专业建设及产业人……
小米为什么现在不用鸿蒙?鸿蒙来了。6月2日晚上8点,鸿蒙线上发布会在万众瞩目中准时开始。华为正式发布了HarmonyOS2(以下简称鸿蒙系统),以及多款新的硬件产品,包括HUAWEIMate40……
医疗数据合规观察保险触碰敏感个人信息如何探索合规之路?南方财经全媒体集团记者孙诗卉实习生周宇上海报道编者按:医疗大数据产业作为国家最早布局和推动数据要素市场的行业,正进入飞速发展时期。与此同时,去年以来,《个人信息保护……
今天矿难了吗多地预出台政策限制挖矿,锁算力显卡定档5月31日今天矿难了吗?来了来了,我又来了,由于昨天没更新,所以今天来的特别早!近期能让显卡降价的消息不少啊,感觉离矿难又近了一步内蒙古出台打击虚拟货币挖矿行为的八项措施(征……
快递不送货上门或被罚三万终结不告而投难在哪儿?你是否也经历过在苦守快递的过程中只等来凭取件码至xx快递柜取xx快递包裹的短信?你是否也曾遗忘快递柜中的快件,却在午夜时分收到一条快递超时即将收费的提醒信息?不过,这些或将成为……
蔚来ES6技术解析蔚来的顶梁柱顶不顶得住ES6是蔚来的第二款量产车型,在ES8奠定了蔚来豪华品牌的基调后,ES6的压力小了很多,在ES8上市后一年就正式上市,节奏还是比较紧凑的,但是也由于前两款车间隔比较近,也导致了……
什么原因让你一定要用iPhone?有一说一,苹果手机现在值得买的是IOS操作系统。我怕我回答这个问题主观意识太强,特意问了我妹、妹夫、表妹、表妹夫。他们都是苹果老用户了,给我的答复就是安卓广告太多,动不动就会下……