23种设计模式----------建造者模式

建造者模式:像是模板方法模式的升级。也叫生成器模式。将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。其实就是创建一大类的东西, 但是具体又有些差异。

在建造者模式中,一般有四个角色:

1,Product产品类。

  该类一般实现了模板方法模式。

2,Builder抽象的建造者。

  规范产品的组建,一般是由子类实现。

3,ConcreteBuilder具体的建造者。

  实现抽象类定义的所有方法,并且可以返回一个组建好的具体对象。

4,Director导演类(一般是包涵多种具体产品差异的方法)。

大致示例代码:

Product类:

1 package com.yemaozi.builderpattern;
2 
3 public abstract class Product {
4     //一般实现模板方法的抽象类。
5 }

具体的Product类:

//ProductA
package com.yemaozi.builderpattern;public class ProductA extends Product{public void doSomething(){}
}
//ProductB
package com.yemaozi.builderpattern;public class ProductB extends Product{public void doSomethding(){}
}

建造器:

1 package com.yemaozi.builderpattern;
2 
3 public interface Builder {
4     //设置产品不同的方法
5     public abstract void setPart();
6     //构建产品
7     public abstract Product builderProduct();
8 }

具体的建造器,具体的建造器个数与具体产品类的数目一致。

 1 //ConcreteBuilderA
 2 package com.yemaozi.builderpattern;
 3 
 4 public class ConcreteBuilderA implements Builder{
 5 
 6     Product p = new ProductA();
 7     
 8     public void setPart() {
 9     }
10 
11     public Product builderProduct() {
12         return p;
13     }
14 }
15 //ConcreteBuilderB
16 package com.yemaozi.builderpattern;
17 
18 public class ConcreteBuilderB implements Builder{
19 
20     Product p = new ProductB();
21     
22     public void setPart() {
23     }
24     
25     public Product builderProduct() {
26         return p;
27     }
28 }

导演类:导演类一般是为了预设置不同产品差异的,若是想得到对应的产品,直接到Director里获取,因为,该类就是为了生产出所有的产品,以供获取。导演类一般可以有多个。

 1 package com.yemaozi.builderpattern;
 2 
 3 public class Director {
 4     private Builder b1 = new ConcreteBuilderA();
 5     private Builder b2 = new ConcreteBuilderB();
 6     //构建A产品
 7     public Product getProductA(){
 8         b1.setPart();
 9         Product p = b1.builderProduct();
10         return p;
11     }
12     //构建B产品
13     public Product getProductB(){
14         b2.setPart();
15         return b2.builderProduct();
16     }
17 }

此外,建造者模式还有一个重要的角色,就是零件(理解为产品类里的方法),建造者是通过零件的组装来创建对象。组装顺序不同(调用方法顺序不同),建造的对象就会有着差异,也是,建造者模式要表达的核心意义。说白了,建造者最主要的功能是基本方法的调用顺序的安排。

和工厂模式的差异:

  工厂方法模式重点是创建。创建零件是它的主要职责,组装顺序不是它关心的。

  建造者模式重点是对已产生的零件进行组装。从而也达到创建对象的效果。

 

转载于:https://www.cnblogs.com/yemaozistar/p/4158764.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批处理启动vm虚拟机服务 vm12启动无界面启动vm虚拟机系统 windows上如何操作服务 sc net启动关闭服务...

windows(win10)批处理脚本 打开vm虚拟机的服务,并且开启无界面虚拟机 echo off net start "vds" net start "VMAuthdService" net start "VMnetDHCP" net start "VMware NAT Service" net start "VMUSBArbService" net star…

机器学习的练功心法(二)——概述

2 概述 文章目录2 概述2.1 模型概述2.1.1 预测房价问题2.1.2 符号2.2 代价函数2.3 代价函数的用处2.4 回到问题2.5 梯度下降2.6 梯度下降知识点总结2.7 线性回归模型的梯度下降2.1 模型概述 2.1.1 预测房价问题 在我们要开始下面的问题前,我们先来看一些关于房价预…

努力做一名认真踏实的工程师

以下内容的来源:http://www.dndev.com/cgi-bin/forum/topic.cgi?forum2&topic1209&show0 转抄网上的一个帖子: 1. 不要看到别人的回复,第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人…

Mac openCV环境搭建

安装 Homebrew $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" $ echo export PATH"/usr/local/bin:$PATH" >> ~/.bash_profile $ brew doctor 安装 OpenCV brew install opencv 安装pip sudo easy_…

Jquery对象和DOM对象---Jquery API (1)

文/饥人谷_韩宝亿(简书作者)原文链接:http://www.jianshu.com/p/98a0c82c47e4著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。一、为什么要用Jquery? DOM API 1.难用 要想拿到一个对象&…

Effective STL中文版pdf

下载地址:网盘下载内容简介 STL是C标准库的一部分。本书是针对STL的经验总结,书中列出了50个条款,绝大多数条款都解释了在使用STL时应该注意的某一个方面的问题,并且详尽地分析了问题的来源、解决方案的优劣。转载于:https:…

关于SWT/JFace中其他常用的事件

1.addSelectionListener:这个监听器最常用. 这个addSelectionListener是一个方法,addSelectionListener(SelectionListener listener)传入的是一个 SelectionListener类型的参数对象.SelectionAdapter实现了这个SelectionListener接口. SelectionListener接口中有下面的这个两个…

机器学习的练功心法(三)——特征工程

文章目录致谢3 特征工程3.1 Sklearn工具及数据集3.2 数据集3.3 数据集的划分3.4 特征工程介绍3.4.1 为什么需要特征工程3.4.2 什么是特征工程3.4.3 特征提取3.4.3.1 字典特征提取3.4.3.2 文本特征提取3.4.3.3 中文文本特征提取3.4.3.4 TF-IDF算法3.5 特征预处理3.5.1 特征预处理…

SDWebImage原理(面试)

SDWebImage 加载图片的流程 入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从…

Win7/8出现An error occurred on the server when processing the URL解决办法

报错:An error occurred on the server when processing the URL. Please contact the system administrator. SJY使用的是win8系统搭建的本地服务器,win7使用的方法是相同的。如果你的系统是精简版的Win7/8,那么安装IIS7也有可能出现这问题。…

数据库杂谈(六)——数据库管理系统

文章目录6 数据库管理系统6.1 数据库管理系统结构简介6.2 进程结构6.2.1 进程的分类6.2.2 线程的由来6.2.3 建立进程的过程6.3 数据目录6 数据库管理系统 6.1 数据库管理系统结构简介 数据库管理系统DBMS是数据库系统的核心。而目前市场上我们接触到的商品化DBMS大多数是关系…

59.排序好的大数据创建索引文件,并实现大文件的二分查找,根据索引百万数据秒读数据...

创建索引 1 //创建索引 2 struct index 3 { 4 //保存每行偏移的位置 5 int *pindex; 6 //文件的总长度 7 int length; 8 }allindex;//索引 初始化索引数组并把索引写入到文件 1 //初始化索引数组,并把索引写入到文件2 void init(char *path)3 {4 printf(&q…

booth算法实现乘法器

booth算法充分的利用到了补码的重要性,使得我们在利用补码进行计算时减少了很多时序。下面的表格是我们假设2 作为乘数所进行的分析。接下来,我将用代码向大家阐述。 1、开始的时候在乘数2的‘负一位’加上一个默认0值00100 2、先判断[0:-1],结果是2‘b0…

OS实验一实验报告

实验一、命令解释程序的编写实验 专业:商业软件工程 姓名:王泽锴 学号:201406114113 一、实验目的 (1)掌握命令解释程序的原理; (2)*掌握简单的DOS调用方法; &#xf…

机器学习的练功方式(四)——KNN算法

文章目录致谢致歉4 KNN算法4.1 sklearn转换器和估计器4.1.1 转换器4.1.2 估计器4.2 KNN算法4.2.1 概述4.2.2 电影类型分析4.2.3 算法实现致谢 闵氏距离_百度百科 (baidu.com) 机器学习之KNN(k近邻)算法详解_平原的博客-CSDN博客_knn 鸢尾花(Iris)数据集_…

bootstrap table入门例子

链接&#xff1a;https://pan.baidu.com/s/1jJ2Y89g 密码&#xff1a;eo7t <!DOCTYPE html> <html> <head><meta charset"utf-8"><link rel"stylesheet" type"text/css" href"lib/bootstrap.min.css">&…

Spring中实现监听的方法

在未使用框架进行编程的时候&#xff0c;我们常常在web.xml中加上这样一段话  <listener><listener-class>XXX</listener-class></listener> 在对应的类中实现ServletContextListener接口&#xff0c;这样在服务器已启动的时候&#xff0c;就会加载相…

《数学之美》读书笔记

之前拜读过吴军老师的《数学之美》。虽然这是一本科普性质的读物&#xff0c;但还是能从中获益匪浅。下面根据记忆以及之前做过的简要的书面笔记&#xff0c;做一个概括。 1.信息的作用在于消除不确定性&#xff0c;自然语言处理的大量问题都是找相关的信息。 2.关于搜索&#…

数据库杂谈(七)——数据库的存储结构

文章目录7 数据库的存储结构7.1 数据库访问管理-文件组织7.2 数据库访问管理——索引技术7 数据库的存储结构 让我们重新温习第六讲的所学知识。 这个图实际上我们要关注的是蓝色箭头指向的那一层。在这一层之上&#xff0c;我们都是对SQL语句动手&#xff0c;而在这一层之下&…

JSP中直接在输入框中校验

jsp: <label class"control-label col-sm-2" for"codeAdd">险种代码<span style"color: red;">*</span></label> <div classcontrols col-sm-4> <input class"form-control remote-validate" data-r…