Java设计模式之建造者模式实例详解
本篇章节讲解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,workType=小说,content=最畅销的的魔幻小说!] */ 更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》 希望本文所述对大家java程序设计有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 使用maven运行Java Main的三种方法解析
- java – Spring引导 – 环境@Autowired抛出NullPointerExce
- java – AlarmManager.AlarmClockinfo.getNextAlarmClock()
- Spring Cloud @RefreshScope 原理及使用
- 01-01java概述 doc命令、jdk\jre下载安装、path、clas
- 在JAVA中仅使用max和min函数查找三个随机数的中间数
- Java连载42-this不能省略的情况、构造方法设置默认值的方法
- 在Java中获取文件创建者/所有者属性
- java – 对于不推荐使用的方法意味着什么,以及如何解决产生
- List集合