首页 > 编程 > Java > 正文

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

2019-11-26 11:20:18
字体:
来源:转载
供稿:网友

本文实例讲述了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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表