软件设计模式--第二章 创建型模式--建造者模式
目录
- 第二章 创建型模式
- 1、创建型模式概述
- 2、建造者模式
- (1)模式的定义与特点
- (2)模式的结构与实现
- (3)应用场景
- (4)扩展
第二章 创建型模式
1、创建型模式概述
主要特点
将对象的创建与使用分离”,这样可以降低系统的耦合度。创建型模式分为以下几种:
⑴单例(Singleton)模式 :某个类只能生成一个实例,该类提供了一个全 局访问点供外部获取该实例,其拓展是有限多例模式。
⑵ 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克 隆出多个和原型类似的新实例。
⑶ 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子 类决定生产什么产品。
⑷ 抽象工厂(Abstract Factory)模式:提供一个创建产品族的接口,其每 个子类可以生产一系列相关的产品。
⑸ 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分, 然后根据不同需要分别创建它们,最后构建成该复杂对象。
2、建造者模式
(1)模式的定义与特点
定义:指将一个复杂对象的构造与它的表示分离,使同样的构建 过程可以创建不同的表示,它是 将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。
优点:
1)各个具体的建造者相互独立的,有利于系统的扩展;
2)客户端不必知道产品内部组成的细节,便于控制细节 风险。缺点:
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.创建型模式概述 2.单例模式(Singleton) (1)模式的定义与特点 (2)模式的结构与实现 (3)应用场景 (4)扩展 第二章 创建型模式 1.创建型模式概述 主 ...
- Java设计模式之创建型:建造者模式
一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...
- 设计模式(创建型)之建造者模式(Builder Pattern)
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...
- 设计模式(20):创建型-抽象工厂模式(Abstract Factory)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- 每天学习一个设计模式(九):创建型之建造者模式
目录 一.基本概念 二.通俗解释 三.建造者模式详解 1.造车的例子 2.建造者模式的结构 3.建造者模式的优点 4.使用场景 5.注意事项 四.建造者模式的扩展和最佳实践 建造者模式的扩展 最佳实践 ...
- java设计模式——创建型之建造者模式
自大学课程初识设计模式以来,就越发觉得有必要系统学习一下设计模式. 刚好在实习前准备期间课比较少,抽出一点时间整理一下记一些笔记,复制粘贴比较多. 笔记比较适合学习过设计模式的同学. Builder ...
- 【创建型】建造者模式(Builder Pattern)
主要作用: 可以使多个简单的对象,一步一步构建成一个复杂的对象 应用实例: 1.去肯德基,汉堡.可乐.薯条.炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐". 2.JA ...
- 软件设计模式作业_创建型设计模式
1.工厂方法模式 1.1 作业题目 用工厂方法模式实现四则计算器 2.建造者模式 2.1 作业题目 建造者模式可以用于快餐店制作儿童餐.典型的儿童餐包括一个主食.一个辅食一杯饮料和 ...
- 大话设计模式之爱你一万年:第二章 创建型模式:单例模式:我的女朋友只有你一个:2.单例模式的实现-懒汉模式
2.单例模式的实现-懒汉模式 视频学习地址 -- <大话设计模式之爱你一万年>:https://dwz.cn/wqO0MAy7 这一节我们先来看看一种实现模式,懒汉模式,这也是这么中实现 ...
最新文章
- Hibernate 异常org.hibernate.LazyInitializationException: could not initialize prox
- 本硕非科班,单模型获得亚军!
- 在Linux上安装QT4
- linux下安装nginx、python、django
- python数学建模可视化_数学建模之流程图和数据可视化
- SQL -- 多表查询
- suse linux 查看内存,Suse linux查询内存大小的指令是什么?
- 【剑指Offer学习】【面试题66:矩阵中的路径】
- 发电机机房设计规范_民用建筑变电所等机房设置的几点建议
- 浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout
- Jupyter Notebook 添加说明表格Cell
- scrapy爬取快代理并保存mongo数据库
- 一文带你理解URI 和 URL 有什么区别?
- JavaScript的封装方法
- 局域网DNS服务器搭建
- 通过图片获取地理位置
- 2021-08-11BUU-CTF:[WUSTCTF2020]alison_likes_jojo
- 台式计算机没有声音,我们家台式电脑没有声音,该怎样设置
- h5 移动开发 html页面跳转,iosh5混合开发项目仿app页面跳转优化
- \t\t让米饭更好吃
热门文章
- 内核实验(五):传统简单字符设备驱动
- TI C2000 TMS320F28379D SCID SCIB 的配置与使用
- STM32 + IAP + Ymodem完美结合
- 我的世界java怎么玩起床战争_我的世界起床战争新手怎么玩 起床战争中前期玩法教学...
- Console Codes of The Elder Scrolls V: Skyrim
- 在input 标签中添加 a标签跳转链接
- 爬虫基础(案例:爬取英雄联盟全皮肤)
- 【全网首发】戴口罩也能百分百用iPhone面容ID解锁手机的方法
- 用cld和rep movsb以字节传送数据
- 程序员如何快速敲代码呢?进来,我教你!