Java设计模式之建造者模式实例详解

时间:2021-05-20

本文实例讲述了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();//这里是上转型对象的使用 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()); }}

更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章