目录

  • 第二章 创建型模式
    • 1、创建型模式概述
    • 2、建造者模式
      • (1)模式的定义与特点
      • (2)模式的结构与实现
      • (3)应用场景
      • (4)扩展

第二章 创建型模式

1、创建型模式概述

  • 主要特点
    对象的创建与使用分离”,这样可以降低系统的耦合度。

  • 创建型模式分为以下几种:
    ⑴单例(Singleton)模式 :某个类只能生成一个实例,该类提供了一个全 局访问点供外部获取该实例,其拓展是有限多例模式。
    ⑵ 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克 隆出多个和原型类似的新实例。
    ⑶ 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子 类决定生产什么产品。
    ⑷ 抽象工厂(Abstract Factory)模式:提供一个创建产品族的接口,其每 个子类可以生产一系列相关的产品。
    ⑸ 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分, 然后根据不同需要分别创建它们,最后构建成该复杂对象。

2、建造者模式

(1)模式的定义与特点

  1. 定义:指将一个复杂对象的构造与它的表示分离,使同样的构建 过程可以创建不同的表示,它是 将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。

  2. 优点:
    1)各个具体的建造者相互独立的,有利于系统的扩展
    2)客户端不必知道产品内部组成的细节,便于控制细节 风险。

  3. 缺点:
    1)产品的组成部分必须相同,**这限制了其使用范围;
    2)如果产品的内部变化复杂,该模式会增加很多的建造 者类

建造者模式注重零部件的组装过程,工厂模式更注重零部件的创建过程

(2)模式的结构与实现

1、结构

  • 产品角色(Product):它是包含多个组成部件的复杂对象, 由具体建造者来创建其各个组成部件。
  • 抽象建造者(Builder):是一个包含创建产品各个子部件的 抽象方法的接口,它通常还包含一个返回复杂产品的方法 getResult()。
  • 具体建造者(ConcreteBuilder):实现了Builder接口,完 成复杂产品的各个部件的具体创建方法。
  • 指挥者(Director):它调用建造者对象中的部件构造与装 配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

结构图:

原理图:

代码:
1)产品角色:是包含多个组成部件的复杂对象。

class Product { private String partA;private String partB;private String partC;}
public void setPartA(String partA) {this.partA = partA;  }public void setPartB(String partB) { this.partB = partB;
}
public void setPartC(String partC) {this.partC = partC;}public void show(){//显示产品的特性}
}

2)抽象建造者:包含创建产品各个子部件的抽象方法。

abstract class Builder {//创建产品对象protected Product product=new Product();public abstract void buildPartA();public abstract void buildPartB();public abstract void buildPartC();//返回产品对象public Product getResult() {return product;}
}

3)具体建造者:实现了抽象建造者接口。


public class ConcreteBuilder extends Builder {public void buildPartA(){product.setPartA("建造PartA");}public void buildPartB(){product.setPartA("建造PartB");}public void buildPartC(){product.setPartA("建造PartC");}
}

4)指挥者:调用建造者中的方法完成复杂对象的创建。

class Director {private Builder builder;public Director(Builder builder) {this.builder=builder; }//产品构建与组装方法public Product construct() { builder.buildPartA(); builder.buildPartB(); builder.buildPartC();return builder.getResult();
} }

5)客户类

public class Client{public static void main(String[] args) {// 创建建造者Builder builder = new ConcreteBuilder();// 创建指挥者,指挥建造者Director director = new Director(builder);// 通过指挥者完成产品的组装Product product = director.construct();product.show();}
}

2、实现

  • 用建造者模式描 述客厅装修。

类图:


代码实现:

产品:客厅

class Parlour {private String wall; //墙private String TV;   //电视private String sofa; //沙发   public void setWall(String wall) {this.wall = wall;}public void setTV(String TV) {this.TV = TV;}public void setSofa(String sofa) {this.sofa = sofa;}  public void show(){System.out.println("客厅装修展示");}}

抽象建造者:装修工人

abstract class Decorator {//创建产品对象protected  Parlour product=new Parlour();// 创建子部件的方法public  abstract void buildWall();public  abstract void buildTV();public  abstract void buildSofa();//返回产品对象public  Parlour getResult() {return  product;}
}

具体建造者:具体装修工人1

class ConcreteDecorator1  extends Decorator{public void buildWall() {product.setWall("w1");}public void buildTV() {product.setTV("TV1");}public void buildSofa() {product.setSofa("sf1");}
}

具体建造者:具体装修工人2

class ConcreteDecorator2  extends Decorator{public void buildWall() {product.setWall("w2");}public void buildTV() {product.setTV("TV2");}public void buildSofa() {product.setSofa("sf2");}
}

指挥者:项目经理

class ProjectManager {private Decorator builder;public ProjectManager(Decorator builder) {this.builder=builder;}//产品构建与组装方法public Parlour decorate() {builder.buildWall();builder.buildTV();builder.buildSofa();return builder.getResult();}
}

confg.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>// 具体装修师2<className>ConcreteDecorator2</className>
</config>

ReadXML:该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象

class ReadXML{//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getObject() {try {//创建文档对象DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;// 对读取配置文件路径doc = builder.parse(new File("src/chapter03/factoryMethod/config.xml"));//获取包含类名的文本节点NodeList nl = doc.getElementsByTagName("className");  Node classNode = nl.item(0).getFirstChild();  // classNode =CattleFarmString cName = "chapter03.factoryMethod." + classNode.getNodeValue();// cName : chapter03.factoryMethod.CattleFarm//通过类名生成实例对象并将其返回Class<?> c = Class.forName(cName);Object obj = c.newInstance();return obj;  // return new CattleFarm();} catch (Exception e) {e.printStackTrace();return null;}}
}

测试类:

public class ParlourDecorator {public static void main(String[] args) {try{// 抽象建造者:装修工人Decorator d;// 获取配置文件中的具体建造者:具体装修工人d=(Decorator) ReadXML.getObject();// 创建指挥者ProjectManager m = new ProjectManager(d);  // 通过指挥者完成产品的组装     Parlour p = m.decorate();p.show();}catch(Exception e){System.out.println(e.getMessage());}}
}

(3)应用场景

建造者模式创建的是复杂对象,其产品的各个部分经常面临着剧烈的变化,但将它们组合在一起的算法却相对稳定.

  • 创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。

  • 产品的构建过程和最终的表示是独立的。

(4)扩展

建造者模式在应用过程中可以根据需要改变,如果创建的产品种类只有一种,只需要一个具体的建造者,这时可以省略掉抽象建造者,甚至可以省略掉指导者角色

  • 可以没有抽象建造者
  • 可以没有指导者

软件设计模式--第二章 创建型模式--建造者模式相关推荐

  1. 软件设计模式--第二章 创建型模式-- 单例模式

    目录 第二章 创建型模式 1.创建型模式概述 2.单例模式(Singleton) (1)模式的定义与特点 (2)模式的结构与实现 (3)应用场景 (4)扩展 第二章 创建型模式 1.创建型模式概述 主 ...

  2. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  3. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  4. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  5. 每天学习一个设计模式(九):创建型之建造者模式

    目录 一.基本概念 二.通俗解释 三.建造者模式详解 1.造车的例子 2.建造者模式的结构 3.建造者模式的优点 4.使用场景 5.注意事项 四.建造者模式的扩展和最佳实践 建造者模式的扩展 最佳实践 ...

  6. java设计模式——创建型之建造者模式

    自大学课程初识设计模式以来,就越发觉得有必要系统学习一下设计模式. 刚好在实习前准备期间课比较少,抽出一点时间整理一下记一些笔记,复制粘贴比较多. 笔记比较适合学习过设计模式的同学. Builder ...

  7. 【创建型】建造者模式(Builder Pattern)

    主要作用: 可以使多个简单的对象,一步一步构建成一个复杂的对象 应用实例: 1.去肯德基,汉堡.可乐.薯条.炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐". 2.JA ...

  8. 软件设计模式作业_创建型设计模式

    1.工厂方法模式 1.1  作业题目         用工厂方法模式实现四则计算器 2.建造者模式 2.1  作业题目 建造者模式可以用于快餐店制作儿童餐.典型的儿童餐包括一个主食.一个辅食一杯饮料和 ...

  9. 大话设计模式之爱你一万年:第二章 创建型模式:单例模式:我的女朋友只有你一个:2.单例模式的实现-懒汉模式

    2.单例模式的实现-懒汉模式 视频学习地址  -- <大话设计模式之爱你一万年>:https://dwz.cn/wqO0MAy7 这一节我们先来看看一种实现模式,懒汉模式,这也是这么中实现 ...

最新文章

  1. Hibernate 异常org.hibernate.LazyInitializationException: could not initialize prox
  2. 本硕非科班,单模型获得亚军!
  3. 在Linux上安装QT4
  4. linux下安装nginx、python、django
  5. python数学建模可视化_数学建模之流程图和数据可视化
  6. SQL -- 多表查询
  7. suse linux 查看内存,Suse linux查询内存大小的指令是什么?
  8. 【剑指Offer学习】【面试题66:矩阵中的路径】
  9. 发电机机房设计规范_民用建筑变电所等机房设置的几点建议
  10. 浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout
  11. Jupyter Notebook 添加说明表格Cell
  12. scrapy爬取快代理并保存mongo数据库
  13. 一文带你理解URI 和 URL 有什么区别?
  14. JavaScript的封装方法
  15. 局域网DNS服务器搭建
  16. 通过图片获取地理位置
  17. 2021-08-11BUU-CTF:[WUSTCTF2020]alison_likes_jojo
  18. 台式计算机没有声音,我们家台式电脑没有声音,该怎样设置
  19. h5 移动开发 html页面跳转,iosh5混合开发项目仿app页面跳转优化
  20. \t\t让米饭更好吃

热门文章

  1. 内核实验(五):传统简单字符设备驱动
  2. TI C2000 TMS320F28379D SCID SCIB 的配置与使用
  3. STM32 + IAP + Ymodem完美结合
  4. 我的世界java怎么玩起床战争_我的世界起床战争新手怎么玩 起床战争中前期玩法教学...
  5. Console Codes of The Elder Scrolls V: Skyrim
  6. 在input 标签中添加 a标签跳转链接
  7. 爬虫基础(案例:爬取英雄联盟全皮肤)
  8. 【全网首发】戴口罩也能百分百用iPhone面容ID解锁手机的方法
  9. 用cld和rep movsb以字节传送数据
  10. 程序员如何快速敲代码呢?进来,我教你!