• 技术文章 >Java >java教程

    Java设计模式中关于建造者模式的示例

    黄舟黄舟2017-09-22 11:29:55原创627
    这篇文章主要介绍了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, workName=null, workType=小说, content=最畅销的的魔幻小说!]
    */

    以上就是Java设计模式中关于建造者模式的示例的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:Java 设计模式 建造者
    上一篇:Java Web项目使用IntelliJ IDEA 15与Maven创建的图文详解 下一篇:Java中局部变量与全局变量的简单介绍
    大前端线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一招教你使用java快速创建Map(代码分享)• PlayFramework 完整实现一个APP(十一)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网