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

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

(0)

相关推荐

  • Java设计模式笔记之抽象工厂代码示例

    上一篇说到了工厂模式,那么学习了工厂模式,抽象工厂也得学习一下.实际上,抽象工厂模式实际上就是在工厂模式的基础上再嵌套一层工厂模式而已,通过父工厂制造子工厂.只是,也并不完全是嵌套一层,各个工厂会被抽象成一个集多个工厂共同点的抽象类.通过工厂制造器,创建出该抽象工厂的子类. 好比如说,一个博客页面有个换肤系统.那么假如有两套风格,黑和白.那么,我选择了黑色风格的,实际这步就相当通过换肤系统这个工厂制造器,创建出一个黑色主题的工厂,该黑色主题的工厂内可以生产各种黑色风格的产品,比如黑色头像挂饰,黑

  • Java设计模式之桥接模式实例详解

    本文实例讲述了Java设计模式之桥接模式.分享给大家供大家参考,具体如下: 概念: 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化. 桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量. 什么情况下会用桥接模式? 简单的说就是我们在抽象对象的特征时,对象的特征属性又很抽象,不得不把属性再次抽象. 否则的话,具体子类的数量将会成几何增长,而且不易扩展.没办法维护现有代码. 举例,我们在抽象手机这二个对象时,它的几个属性,如

  • Java设计模式——工厂设计模式详解

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类. 工厂模式的形态 工厂模式主要用一下几种形态: 1:简单工厂(Simple Factory). 2:工厂方法(Factory Method). 3:抽象工厂(Abstract Factory). 简单工厂(Simple Factory) 又叫静态工厂,是工厂模式三中状态中结构最为简单的.主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例.我们来看一个具体的例子: 假设一家工厂,几生产洗衣

  • Java设计模式之代理模式与装饰模式实例详解

    本文实例讲述了Java设计模式之代理模式与装饰模式.分享给大家供大家参考,具体如下: 之所以把这两种模式放在一起说,是因为我发现这了两种模式几乎一模一样! 从网上也搜了一些资料,发现两者还是有一些区别的.我们在学习的同时也把这种困惑搞清楚. 定义: 代理模式,为其他对象提供一种代理以控制对这个对象的访问. 装饰模式,动态地给一个对象添加一些额外的职责. 代理模式,很好理解,就是把一个对象再次封装,以后就对封装的对象访问就可以了. 因为代理对象已经取代了被代理对象. 装饰模式,给一个对象增加功能,

  • java中设计模式之适配器模式

    java中设计模式之适配器模式  前言: 适配器模式可以将一个类或接口应用于另一个不同但是却有联系的接口,主要的做法是通过声明一个目标接口的实现类,在该类中声明一个将被适配类或接口(被适配者)作为参数的构造器和被适配者的实例,这样在实现目标接口的时候就可以调用被适配者的实例,并且辅以一些额外的操作.适配器模式的主体有三个部分:适配者,适配者实现类和被适配者.具体类结构如下图: 这里将被适配者的对象以组合的方式放到适配器类中,那么被适配者及其实现者都可以使用该适配器.适配器模式的优点在于可以将不同

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

    本文实例讲述了Java设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式(builder)可以将部件和其组装过程分开.一步一步创建一个复杂的对象. 用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节. 什么情况下会用到建造者模式? 个人理解,当我们创建的对象在创建时需要逻辑的时候. 比如,一个简单的pojo对象,我们想要创建,直接就可以new出来,没有什么逻辑. 当有一个复杂的对象,你想要创建它时,它的各个属性之间是有逻辑关系的. 一个属性赋值取值依赖于

  • Java设计模式之监听器模式实例详解

    本文实例讲述了Java设计模式之监听器模式.分享给大家供大家参考,具体如下: 监听器模式有三个要素--事件源.事件对象.监听器. 事件源:顾名思义,事件发生的源头,比如点击的按钮,属于被监听的对象: 事件对象:这个经常和事件源混淆,它经常被用来包装事件源,切记,它毕竟是个事件,比如点击事件,和事件源的区别自己感受,木有栗子: 监听器:这个是监听器模式的核心,定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参. 下面举个简单的栗子: 故事背景是,小明是个不讲卫生的孩子,他妈妈很担心他的健

  • java设计模式之工厂模式实例详解

    本文实例讲述了java设计模式之工厂模式.分享给大家供大家参考,具体如下: 工厂模式(factory) 涉及到4个角色:抽象工厂类角色,具体工厂类角色,抽象产品类角色和具体产品类角色. 抽象工厂类角色使用接口或者父类来描述工厂的行为, 具体工厂类角色负责创建某一类型的产品对象. 抽象产品类可以使用接口或者父类来描述产品对象的行为特征. 具体产品类就是某一具体的对象. 工厂模式不同于静态工厂模式的地方: 工厂模式在工厂类也实现了多态,而不仅仅是在产品对象上实现多态. 它可以应对不同类型的产品对应一

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

    本文实例讲述了Python设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 下面是一个建造者模式的demo #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' """ 大话设计模式 设计模式--建造者模式 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得

  • Java结构型设计模式中建造者模式示例详解

    目录 建造者模式 概述 角色 优缺点 应用场景 基本使用 创建产品类 创建建造者类 使用 链式写法 创建产品类与建造者类 使用 建造者模式 概述 建造者模式(Builder Pattern)属于创建型模式. 它是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 简而言之:建造者模式就是使用多个简单的对象一步一步构建成一个复杂的对象. 建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定.如果一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和使用进行分

  • Java设计模式之工厂模式案例详解

    目录 分类 案例 需求 方案一:简单工厂模式 方案二:工厂方法模式 方案三:抽象工厂模式 对比分析 总结 分类 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 案例 需求 根据蛋糕的不同口味,分别创建苹果味和香蕉味的蛋糕实例 方案一:简单工厂模式 定义蛋糕父类 /** * 蛋糕 * @author:liyajie * @createTime:2022/2/14 10:17 * @version:1.0 */ public class Cake { } 定义苹果味的蛋糕 /** * 苹果蛋糕

  • Java设计模式之外观模式示例详解

    目录 定义 案例 需求 方案:外观模式实现 分析 总结 定义 外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节 案例 需求 看电影的时候需要进行一系列的操作,比如打开播放器,放下屏幕,打开投影仪,打开音响等,这个要怎么进行管理呢 方案:外观模式实现 定义播放器类 public class Player { private static Player player = new Player(); private Player(){}

  • Java设计模式之策略模式示例详解

    目录 定义 结构 UML类图 UML序列图 深入理解策略模式 策略和上下文的关系 策略模式在JDK中的应用 该策略接口有四个实现类 策略模式的优点 策略模式的缺点 策略模式的本质 在讲策略模式之前,我们先看一个日常生活中的小例子: 现实生活中我们到商场买东西的时候,卖场往往根据不同的客户制定不同的报价策略,比如针对新客户不打折扣,针对老客户打9折,针对VIP客户打8折... 现在我们要做一个报价管理的模块,简要点就是要针对不同的客户,提供不同的折扣报价. 如果是有你来做,你会怎么做? 我们很有可

  • Java设计模式中桥接模式应用详解

    目录 1.桥接(Bridge)设计模式定义 2.桥接设计模式优点以及不足 3.桥接设计的实现思路 4.桥接设计模式示例 5.桥接模式的应用场景 6.桥接设计模式和适配器设计模式对比 编程是一门艺术,大批量的改动显然是非常丑陋的做法,用心的琢磨写的代码让它变的更美观. 显示生活中有物品具有多个维度的属性,比如文字有颜色和字体两个维度的差别,汽车有颜色和牌子两个维度的属性等.如果用继承方式,不但对应的子类很多,而且扩展困难.如果用桥接模式就能很好地解决这些问题. 1.桥接(Bridge)设计模式定义

随机推荐