您当前的位置:首页 > 美文摘抄 > 内容

builder模式(什么是建造者模式)

本文目录

  • 什么是建造者模式
  • hbuilder夜间模式白天可以使用么
  • 急!!!!用Java编写,使用设计模式中Builder模式创建树形菜单,其中要求树形菜单为一个满二叉树
  • android,,Builder 的作用是什么
  • 为什么要用builder设计模式
  • 怎样才能进入adams/car的template builder模式呢
  • java builder模式为什么很少人用

什么是建造者模式

建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式实用范围1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2 当构造过程必须允许被构造的对象有不同表示时。角色在这样的设计模式中,有以下几个角色:1 builder:为创建一个产品对象的各个部件指定抽象接口。2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。3 Director:构造一个使用Builder接口的对象。4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。例子Builderpublic interface PersonBuilder {void buildHead();void buildBody();void buildFoot();Person buildPerson();}//具体建造工具ConcreteBuilderpublic class ManBuilder implements PersonBuilder {Person person;public ManBuilder() {person = new Person();}public void buildbody() {person.setBody(“建造男人的身体“);}public void buildFoot() {person.setFoot(“建造男人的脚“);}public void buildHead() {person.setHead(“建造男人的头“);}public Person buildPerson() {return person;}}//建造者Directorpublic class PersonDirector {public Person constructPerson(PersonBuilder pb) {pb.buildHead();pb.buildBody();pb.buildFoot();return pb.buildPerson();}}Productpublic class Person {private String head;private String body;private String foot;public String getHead() {return head;}public void setHead(String head) {this.head = head;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}public String getFoot() {return foot;}public void setFoot(String foot) {this.foot = foot;}}public class Man extends Person {}Testpublic class Test{public static void main(String args) {PersonDirector pd = new PersonDirector();Person person = pd.constructPerson(new ManBuilder());System.out.println(person.getBody());System.out.println(person.getFoot());System.out.println(person.getHead());}}result建造男人的身体建造男人的脚建造男人的头扩展建造者模式在使用过程中可以演化出多种形式:省略抽象建造者角色如果系统中只需要一个具体的建造者的话,可以省略掉抽象建造者。这是代码可能如下:class FoodManager{private:BuilderA * builder;public:FoodManager() {builder = new BuilderA();};void Construct(){builder-》BuildRiceNoodles();builder-》BuildDrink();builder-》BuildCoolDish();}};省略指导者角色在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色,让Builder自己扮演指导者和建造者双重角色。这是代码可能如下://builderclass Builder{private:Food * food;public:Builder(){food = new Food();}void BuildRiceNoodles() {//..};void BuildCoolDish(){//..};void BuildDrink(){//..};Food * getFood(){return food;}void Construct(){BuildRiceNoodles();BuildCoolDish();BuildDrink();}};同时,客户端也需要进行相应的调整,如下://clientint _tmain(int argc, _TCHAR* argv){Builder * builder = new Builder();builder-》Construct();Food *food = builder-》getFood();food-》show();return 0;}C#中的StringBuilder就是这样一个例子。

hbuilder夜间模式白天可以使用么

当然可以了。手机百度的夜间模式,在刚打开手机百度时并不能看到需要先在手机百度的搜索框里任意输入一个内容先搜索一下这样,进入到手机百度的第二个页面后,就可以在屏幕的右上角,看到有一个三个点组成的图标,点击后,就会在手机屏幕的下面弹出一个设置框,在这里就可以看到那个夜间模式的按钮了,点击它一下这时,当前屏幕浏览的内容,就会瞬间转换成夜间模式的状态,这样,原来觉得白晃晃的屏幕就没那么刺眼了如果到了白天或者光线比较强的地方,需要再将夜间模式再调回白天模式的话,那么只要再点击右上角三个点的那个图标。

急!!!!用Java编写,使用设计模式中Builder模式创建树形菜单,其中要求树形菜单为一个满二叉树

public class PrintTreeMenu {int level = 1;public static void main(String args) throws Exception {PrintTreeMenu pt = new PrintTreeMenu();pt.print(“Level_1“, 1, 4);}// need parent nodeString, the last letter of parent stringprivate void print(String val, int i, int n) {if (i 《 Math.pow(2, n)) {if (level 》 1)val = val + “_“ + (i % 2 == 0 ? 1 : 2);System.out.println(val);val = val.replace(“Level_“ + level, “Level_“ + (level + 1));level++;String baseVal = val.trim();val = getMenuStr(val.length()) + baseVal;print(val, 2 * i, n);print(val, 2 * i + 1, n);level--;}}private String getMenuStr(int n) {String spaces = ““;for (int i = 0; i 《 n; i++)spaces += “ “;return spaces;}}---------output:Level_1       Level_2_1                Level_3_1_1                           Level_4_1_1_1                           Level_4_1_1_2                Level_3_1_2                           Level_4_1_2_1                           Level_4_1_2_2       Level_2_2                Level_3_2_1                           Level_4_2_1_1                           Level_4_2_1_2                Level_3_2_2                           Level_4_2_2_1                           Level_4_2_2_2不知道对不对,花了几个小时,其实做出来也没有意义了,感觉有点拼凑出来的味道。这个level是第几层的意思,i是根,2*i是左,2*i+1是右。

android,,Builder 的作用是什么

使用了简化的builder模式,将抽象建造者省略,只使用一个具体建造者,并且将指导者角色也省略了。 AlertDialog.Builder就是具体建造者,另外,它是以匿名类的方式被创建的,而且,Builder类是AlertDialog的内部类,这样,耦合性比较低

为什么要用builder设计模式

为创建一个Product对象的各个部件指定抽象接口。ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部件。 定义并明确它所创建的表示。 提供一个检索产品的接口Director 构造一个使用Builder接口的对象。Product 表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。产品复杂,且它允许使用者不必知道内部构建细节的情况下使用。

怎样才能进入adams/car的template builder模式呢

注意你的acar文件,不是在安装文件夹中的那个,而是在c盘中c:\documentsandsettings\administrator里的那个acar.cfg文件,将desiredusermode(standard/expert)environmentmdi_acar_usermodestandard修改为environmentmdi_acar_usermodeexpert,就可以在进入adams/car时选择templatebuilder模块了(我就是这样的)

java builder模式为什么很少人用

我认为Java语言的10大问题是:1、缺少闭包(closure):我想这个不需要解释了。函数式编程已经存在几十年了,但最近几年,它们获得了越来越多的关注,最主要的原因,是它可以自然地编写并行程序。我部分的同意Joshua Bloch强调在Java中引入闭包的问题需要再想一想(BGGA提议的方式真的很糟),至少闭包的缺失,使得在Java中做任何真正的函数式编程都是不可能的。2、缺少一等函数:这个问题与前一个有些关联,但我认为它更糟糕。在Java里,要达到类似效果的唯一方式,是使用著名的、丑陋悲惨的单方法匿名内部类,但这看上去的确是一个拙劣的方法。甚至在C#中,也通过代理机制,提供了一个更好的实现。3、原生类型(Primitive types):如果在Java中一切皆对象,那是多么完美啊,但他们偏偏不这样设计。因而,这一点导致了一些问题,比如,不能把一个int放到集合(Collection)里,这个在Java5中通过自动装箱特性得到了解决(下面会提到)。它也造成了传值与传引用上的困扰,原生类型数据是通过值传给方法的(复制一份拷贝,然后传给函数),而真正的对象是通过传递(译注:其实是复制对象地址再传递,因此应该也是传值方式,只是由于函数内部可通过这个对象地址访问对象,因此效果上类似传引用)。4、自动装箱(Autoboxing)和自动拆箱(autounboxing):这个特性是为了解决因原生类型的存在所导致的问题,在Java5引入的。它允许静默地转换原生类型到相应的对象,但这常常导致其它的问题。比如Integer可以为null,但int不能,因此这时JVM只能抛出一个难以调试的空指针异常(NullPointerException)。此外,它还可能导致其它奇怪的行为,就像下面的例子,我们就很难理解,变量test为什么是false:Intger a = new Integer(1024);Intger b = new Integer(1024);boolean test = a b || a == b || a 》 b;5、缺少范型具类化:范型是Java5引入的一个很酷的特征,但是为了保持与旧版本Java的兼容性,导致缺失某些重要的特性,尤其是不能在运行时反省范型的类型。例如,你有一个方法,接受List参数,如果传进来一个List,你却不能知道运行里该范型的确切类型。同理,你也不能创建范型数组。这意味着,尽管下面的代码看起来很自然,但却不编译不了:List listsOfStrings = new List;6、不可避免的范型警告:你有发现过自己陷入不可能去掉的关于范型的警告么?如果你像我一样大量使用范型,我打赌你碰到过。事实上,是这个问题的规模化症状,让他们认为需要引入一个特定的注解(@SuppressWarnings(“unchecked“))来处理这种情况,我觉得,范型应该可能被设计的更好。7、不能传void给方法调用:我得承认,这种给方法传递void的需求,乍一看有些怪异。我喜欢DSL,当我实现自己的DSL库(lambdaj)的一个特定特性时,我不得不需要一个方法声明成这样的签名:void doSomething(Object parameter),这里为这个方法传进来的参数parameter,是另一个方法调用的结果,它唯一的目的,是注册调用(的对象)自身,以可以在以后执行它。让我吃惊的是,即使println方法返回void,看上去也并没有一个好理由,不允许我把代码写成这样,:doSomething(System.out.println(“test“));8、没有原生的代理机制:代理是一种非常有效和应用广泛的模式,但Java提供的代理机制,只针对接口,而不是具体类。这是为什么象cblib这样提供这种机制的库,被如此多的主流框架,如Spring和Hibernate,采用的原因。此外,由于cglib通过运行时创建被代理类的子类来实现的,因此这些种方式有一个众所周知的限制——不能代理final类,比如String。9、差劲的Switch...case语句:Java规定,switch...case只能选择int和enum(Java5开始)。这一点如果跟更现代的语言如Scala相比,看起来简直太弱了。10、受检查异常(Checked exception):类似原生类型,受检查异常也已经成为Java的一个罪孽之源。它迫使程序员必须做下面两件极其糟糕讨厌的事情中的一个:让你的代码里充斥大量的、糟糕难读的、容易出错的try...catch语句,而这样做的最大意义,只是将捕获的异常,包装成运行时异常,然后再重新抛出;或者是让大量的抛出声明子句污染你的API,让接口缺少灵活性和可扩展性。真正的问题是,这里我提到的这几大主要问题,唯一的解决办法,是要做一个痛苦的决择,定义一套新的语言规范,放下当前版本的向后兼容性。我猜他们永远也不会这么做,虽然我相信,如果编写一个能够自动转换旧Java源码的程序,让它们与假设的新版本兼容,并不是很困难。最后,这就是我决定开始寻找一个更好的JVM兼容语言的原因。


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 智能家居装修效果图欣赏(都有哪些性价比相对高的智能家居搭建方案和技巧)

下一篇: 合肥三菱空调(三菱重工海尔空调(水机系统)RCU130A主机的变压器坏了,在哪有卖的啊)



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号