本文实例讲述了Java设计模式之建造者模式。分享给大家供大家参考,具体如下:
建造者模式(builder)可以将部件和其组装过程分开.一步一步创建一个复杂的对象。
用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节.
什么情况下会用到建造者模式?
个人理解,当我们创建的对象在创建时需要逻辑的时候。
比如,一个简单的pojo对象,我们想要创建,直接就可以new出来,没有什么逻辑。
当有一个复杂的对象,你想要创建它时,它的各个属性之间是有逻辑关系的。
一个属性赋值取值依赖于其他属性。那么这个对象的创建就不是简单的new出来的。
在创建之前,我们必须把这个逻辑写清楚。
建造模式使得客户不需要知道太多产品内部的细节。它将复杂对象的组建和表示方式封装在一个具体的建造角色中,而且由指导者来协调建造者角色来得到具体的产品实例。
它的模型:
抽象产品类 Product
package org.test.design.build; /** * 影视,书籍等作品 * @author lushuaiyin * */ public abstract class Product { public String author;//作者 public int funds=0;//耗资 public String workName;//作品名称 public String workType;//作品类型 public String content;//其他信息 public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getFunds() { return funds; } public void setFunds(int funds) { this.funds = funds; } public String getWorkName() { return workName; } public void setWorkName(String workName) { this.workName = workName; } public String getWorkType() { return workType; } public void setWorkType(String workType) { this.workType = workType; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String printString() { return "Product [author=" + author + ", funds=" + funds + ", workName=" + workName + ", workType=" + workType + ", content=" + content + "]"; } }
具体产品类 Movie Book
package org.test.design.build; public class Movie extends Product{ private String actor;//主演 private String director;//导演 public String getActor() { return actor; } public void setActor(String actor) { this.actor = actor; } public String getDirector() { return director; } public void setDirector(String director) { this.director = director; } }
package org.test.design.build; public class Book extends Product { private int price=0; public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }
抽象建造者 Builder
package org.test.design.build; /** * 对象的构建逻辑描述 * 影视,书籍等作品创建步骤 * @author lushuaiyin * */ public interface Builder { void recruiting();//人员招募 void writeScript();//写剧本,书 void raiseFunds();//筹集资金 void propagate();//宣传 void released();//出版,发行,上映 Product buildProduct(); }
具体建造者 MovieBuilder BookBuilder
package org.test.design.build; /** * Movie对象的构建逻辑具体实施 * @author lushuaiyin * */ public class MovieBuilder implements Builder { public Product movie=new Movie();//这里是上转型对象的使用 /* 假如我们创建的对象只关心行为特征,那么就可以使用父类或者接口来声明对象。 这样就不会在创建的时候就不会涉及到具体对象类的其他私有属性。 如果我们在创建的时候,关心这些属性。那么就直接使用子类new出对象。 Movie movie=new Movie(); */ public void recruiting() { movie.setAuthor("詹姆斯·卡梅隆"); } public void writeScript() { movie.setWorkName("阿凡达"); } public void raiseFunds() { movie.setFunds(200000); } public void propagate() { movie.setContent("首部3D科幻巨作!"); } public void released() { movie.setWorkType("3D电影"); } public Product buildProduct() { return movie; } }
package org.test.design.build; /** * Book对象的构建逻辑具体实施 * @author lushuaiyin * */ public class BookBuilder implements Builder { public Product book=new Book();//这里是上转型对象的使用 public void recruiting() { book.setAuthor("J.K.罗琳著小说"); } public void writeScript() { book.setWorkName("哈利·波特与魔法石"); } public void raiseFunds() { book.setFunds(10000); } public void propagate() { book.setContent("最畅销的的魔幻小说!"); } public void released() { book.setWorkType("小说"); } public Product buildProduct() { return book; } }
指挥者 Director
package org.test.design.build; /** * 指挥者角色 * @author lushuaiyin * */ public class Director { public Product bulidProduct(Builder builder){ builder.raiseFunds();//筹集资金 builder.recruiting();//招募人员 builder.propagate();//宣传 builder.released();//发行,上映 return builder.buildProduct(); } }
测试:
package org.test.design.build; public class TestMain { /** * @param args */ public static void main(String[] args) { Director director=new Director();//指挥者角色 //一部电影的产生 MovieBuilder movieBuilder=new MovieBuilder(); Product movie=director.bulidProduct(movieBuilder); System.out.println(movie.printString()); // 一部小说的产生 BookBuilder bookBuilder=new BookBuilder(); Product book=director.bulidProduct(bookBuilder); System.out.println(book.printString()); } } /*打印 Product [author=詹姆斯·卡梅隆, funds=200000, workName=null, workType=3D电影, content=首部3D科幻巨作!] Product [author=J.K.罗琳著小说, funds=10000, workName=null, workType=小说, content=最畅销的的魔幻小说!] */
更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
介绍 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。 建造者模式可以将一个复杂对象的构建与其表
本文向大家介绍Java设计模式之建造者模式(Builder模式)介绍,包括了Java设计模式之建造者模式(Builder模式)介绍的使用技巧和注意事项,需要的朋友参考一下 Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用户不知道内部的具体
本文向大家介绍JavaScript设计模式之观察者模式实例详解,包括了JavaScript设计模式之观察者模式实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript设计模式之观察者模式。分享给大家供大家参考,具体如下: 观察者模式 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主
本文向大家介绍JavaScript设计模式之调停者模式实例详解,包括了JavaScript设计模式之调停者模式实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript设计模式之调停者模式。分享给大家供大家参考,具体如下: 1、定义 调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响
本文向大家介绍JavaScript设计模式之建造者模式介绍,包括了JavaScript设计模式之建造者模式介绍的使用技巧和注意事项,需要的朋友参考一下 建造者模式说明 1. 将一个复杂对象的 构造 与它的表示相分离,使同样的创建过程可有不同的表示,这就叫做建造者模式。 2. 面向对象语言中的说明,主要角色: 1>. Builder 这个接口类,定义这个建造者[工人],统一的可操作的行为方式,它表示
本文向大家介绍JAVA设计模式之访问者模式详解,包括了JAVA设计模式之访问者模式详解的使用技巧和注意事项,需要的朋友参考一下 在阎宏博士的《JAVA与模式》一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。 分派的概念 变量被声明时的
本文向大家介绍Java设计模式之创建者模式简介,包括了Java设计模式之创建者模式简介的使用技巧和注意事项,需要的朋友参考一下 Java的创建者模式与工厂模式有点类似,不过关注点不同。工厂模式往往只关心你要的是什么,而不关心这个东西的具体细节是什么。相对而言创建模式则是关心这个东西的具体细节的创建。拿创建人物来说,我们关心的不仅是创建一个人物,还要关心他的性别,肤色和名字,则可以使用创建者模式。
本文向大家介绍JavaScript设计模式之享元模式实例详解,包括了JavaScript设计模式之享元模式实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript设计模式之享元模式。分享给大家供大家参考,具体如下: 通过两个例子的对比来凸显享元模式的特点:享元模式是一个为了提高性能(空间复杂度)的设计模式,享元模式可以避免大量非常相似类的开销。 第一实例,没有使用享元模