建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

Product类:

  1. package cn.happy.design_pattern._09builder;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class Product {
  7.  
  8. List<String> parts = new ArrayList<>();
  9.  
  10. public void add(String part){
  11. parts.add(part);
  12. }
  13.  
  14. public void show(){
  15. System.out.println("创建产品...");
  16. for (String item : parts) {
  17. System.out.println(item);
  18. }
  19. }
  20. }

Builder类:

  1. package cn.happy.design_pattern._09builder;
  2.  
  3. public abstract class Builder {
  4.  
  5. public abstract void BuildPartA();
  6. public abstract void BuildPartB();
  7. public abstract Product GetResult();
  8. }

Builder子类:

  1. package cn.happy.design_pattern._09builder;
  2.  
  3. public class ConcreteBuilder1 extends Builder {
  4.  
  5. private Product product = new Product();
  6. @Override
  7. public void BuildPartA() {
  8. product.add("部件A");
  9.  
  10. }
  11.  
  12. @Override
  13. public void BuildPartB() {
  14. product.add("部件B");
  15.  
  16. }
  17.  
  18. @Override
  19. public Product GetResult() {
  20. // TODO Auto-generated method stub
  21. return product;
  22. }
  23.  
  24. }
  25.  
  26. public class ConcreteBuilder2 extends Builder {
  27.  
  28. private Product product = new Product();
  29. @Override
  30. public void BuildPartA() {
  31. product.add("部件X");
  32.  
  33. }
  34.  
  35. @Override
  36. public void BuildPartB() {
  37. product.add("部件Y");
  38.  
  39. }
  40.  
  41. @Override
  42. public Product GetResult() {
  43. // TODO Auto-generated method stub
  44. return product;
  45. }
  46.  
  47. }

Director类:

  1. package cn.happy.design_pattern._09builder;
  2.  
  3. public class Director {
  4.  
  5. public void Construct(Builder builder){
  6. builder.BuildPartA();
  7. builder.BuildPartB();
  8. }
  9. }

测试类:

  1. package cn.happy.design_pattern._09builder;
  2.  
  3. public class Mmain {
  4. public static void main(String[] args) {
  5. Director director = new Director();
  6. Builder b1 = new ConcreteBuilder1();
  7. Builder b2 = new ConcreteBuilder2();
  8. director.Construct(b1);
  9. b1.GetResult().show();
  10. director.Construct(b2);
  11. b2.GetResult().show();
  12. }
  13. }

Java学习笔记——设计模式之九.建造者模式的更多相关文章

  1. Java学习笔记——设计模式之二.策略模式

    明确是王道 --Clean Code 先定义策略类 package cn.no2.strategy; public abstract class Strategy { //省略属性 //算法方法 pu ...

  2. Java学习笔记——设计模式之四.代理模式

    To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: p ...

  3. Java学习笔记——设计模式之八.外观模式

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 子系统: package cn.happy.design_patter ...

  4. Java学习笔记——设计模式之七.模板方法模式

    模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图: 代码: 算法骨架 ...

  5. Java学习笔记——设计模式之六.原型模式(浅克隆和深克隆)

    That there's some good in this world, Mr. Frodo. And it's worth fighting for. 原型模式(prototype),用原型实例指 ...

  6. Java进阶篇设计模式之九----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  7. Java学习笔记(十九)——Java 日志记录 AND log4j

    [前面的话] 学习的进度应该稍微在快一点. Java日志到了必须学习怎么使用的时候了,因为在项目中要进行使用.基础性文章,选择性阅读. [结构] java日志对调试,记录运行,问题定位都起到了很重要的 ...

  8. 疯狂java学习笔记之面向对象(九) - 抽象和接口

    一.抽象(abstract): 1.抽象类: 使用abstract修饰的类就是抽象类; 相比于普通类抽象类增加了支持抽象方法的功能,但也丢失了创建实例的功能(抽象类中不能创建实例),其他普通类有的抽象 ...

  9. Java学习笔记——设计模式之五.工厂方法

    水边一只青蛙在笑 --石头和水 工厂方法模式(Factory Method),定义了一个用于创建对象的接口,让实现类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 这里在简单和工厂的基础上 ...

随机推荐

  1. POCO文档翻译:POCO C++库入门指南

    内容目录 介绍 Foundation库 XML库 Util库 Net库 将这些东西组合到一起 介绍 POCO C++库是一组开源C++类库的集合,它们简化及加速了用C++来开发以网络功能为核心的可移植 ...

  2. WPF范围选择控件(RangeSelector)

    原文:WPF范围选择控件(RangeSelector) 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP11199988899/art ...

  3. 初次使用glog

    一.安装配置 1.简单介绍 google 出的一个C++轻量级日志库,支持下面功能: ◆ 參数设置,以命令行參数的方式设置标志參数来控制日志记录行为: ◆ 严重性分级,依据日志严重性分级记录日志: ◆ ...

  4. Program for Linux USB-devices driver step by step (ONE)

    Program for Linux USB-devices driver 開始啃硬骨头~ 这里我打算一步步给出USB device driver 的demo.希望有心能可以共同交流学习. 希望认识很多 ...

  5. express的路由规则

    路由规则 express 封装了多种 http 请求方式,我们主要只使用 get 和 post 两种. get 和 post 的第一个参数都为请求的路径,第二个参数为处理请求的回调函数,回调函数有两个 ...

  6. VS中发布并调试IIS程序(非附加进程!!!)

    筒子们,你们不觉得发布到IIS再附加进程太烦了么???看了看网上全是这种方法,这不科学!VS已经提供了更好的方式了,少年们! 流程 1.打开你的IIS,创建一个站点示例中,我创建了一个端口号为5002 ...

  7. WPF编游戏系列 之五 数据绑定

    原文:WPF编游戏系列 之五 数据绑定        在上一篇通过用户控件将重复使用的控件封装为一个控件组,大大减少了C#代码数量,本篇继续对该控件组进行数据绑定,节省为每个控件赋值的工作.对于数据绑 ...

  8. Code First 连接已有数据库

    连接数据库                 生成结果并没有一个可视化界面(Model First有)     其他 连接数据库之后,可以采用migration管理第一次add-migration XX ...

  9. XF 导航页面

    using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; [assembly: XamlCompilation (XamlCompila ...

  10. SICP 1.17-1.19

    1.16 -------------> 不考虑0的情况 <------------ (define (fe b n) (define (fet m c) (cond ((= m n) c) ...