创建者模式

转载自 设计模式之创建者模式

创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

创建者模式通常包括如下几种角色:

1.建造者角色(Builder)

对复杂对象的创建过程加以抽象,给出一个抽象接口,以规范产品对象的各个组成部分的建造。这个接口规定了要实现复杂对象的哪个部分的创建,但并不涉及具体对象不见的创建。

2.具体创建者角色(ConcreateBuilder)

实现Builder接口,针对不同的业务逻辑,具体化复杂对象的各个部分的创建。在建造过程完成后,提供产品的实例。

3.指导者(Director)

调用具体建造者来创建复杂对象的各个部分,在指导者中不设计具体产品的信息,只负责保证对象各部分完整创建或者按某种顺序创建。

4.产品(Product)

要创建的复杂对象,一般来说包含多个部分。

下面给出创建者模式的UML图:

下面我们通过代码体会一下:

首先我们定义Product类,里面用一个List存储product对象的各个部分:

复制代码
 1 /**
 2  * Created by ufenqi lixiuyu.
 3  */
 4 public class Product {
 5     private List<String> parts = new ArrayList<String>();
 6 
 7     public void add(String partName){
 8         parts.add(partName);
 9     }
10 
11     public void show(){
12         System.out.println("----产品创建----");
13         for (String part : parts) {
14             System.out.println(part);
15         }
16     }
17 }
复制代码

然后,我们定义Builder抽象类,并定义Product包括partA,partB,partC三个部分:

复制代码
1 public abstract class Builder {
2     protected abstract void buildPartA();
3     protected abstract void buildPartB();
4     protected abstract void buildPartC();
5 
6     protected abstract Product getResult();
7 }
复制代码

下面分别定义ConcreateBuilder角色的BuilderA及BuilderB:

复制代码
 1 public class BuilderA extends Builder {
 2     private Product product = new Product();
 3 
 4     @Override
 5     protected void buildPartA() {
 6         product.add("partA");
 7     }
 8 
 9     @Override
10     protected void buildPartB() {
11         product.add("partB");
12     }
13 
14     @Override
15     protected void buildPartC() {
16         product.add("partC");
17     }
18 
19     @Override
20     protected Product getResult() {
21         return product;
22     }
23 }
复制代码
复制代码
 1 public class BuilderB extends Builder {
 2     private Product product = new Product();
 3 
 4     @Override
 5     protected void buildPartA() {
 6         product.add("partX");
 7     }
 8 
 9     @Override
10     protected void buildPartB() {
11         product.add("partY");
12     }
13 
14     @Override
15     protected void buildPartC() {
16         product.add("partZ");
17     }
18 
19     @Override
20     protected Product getResult() {
21         return product;
22     }
23 }
复制代码

下面我们定义指导者角色BuilderDirector,在类中添加Builder的引用,并通过其构造方法初始化builder属性:

复制代码
 1 public class BuilderDirector {
 2 
 3     private Builder builder = null;
 4 
 5     public BuilderDirector(Builder builder){
 6         this.builder = builder;
 7     }
 8 
 9     public Product build(){
10         builder.buildPartA();
11         builder.buildPartB();
12         builder.buildPartC();
13         return builder.getResult();
14     }
15 
16 }
复制代码

编写测试类:

复制代码
 1 public class BuilderTest {
 2 
 3     public static void main(String[] args) {
 4 
 5         BuilderDirector director = new BuilderDirector(new BuilderB());
 6         Product product = director.build();
 7         product.show();
 8     }
 9 
10 }
复制代码

运行结果如下:

----产品创建----
partX
partY
partZ

总结:

1)使用建造者模式的好处:

①使用建造者模式可以使客户端不必知道产品内部组成的细节。

②具体的建造者类之间是相互独立的,这有利于系统的扩展。

③具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。

2)建造者模式的使用场景:

①创建一些复杂对象时,这些对象的内部组成部分之间的建造顺序是稳定的,但对象的内部组成构建面临着复杂的变化。

②要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。


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

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

相关文章

buildpack_使用Buildpack容器化Spring Boot应用程序

buildpack在本文中&#xff0c;我们将看到如何使用Buildpacks容器化Spring Boot应用程序。 在先前的一篇文章中&#xff0c;我讨论了Jib 。 Jib允许我们在不使用Dockerfile的情况下将任何Java应用程序构建为Docker映像。 现在&#xff0c;从Spring Boot 2.3开始&#xff0c;我们…

MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据

【0】README0.1&#xff09;本文部分文字描述转自“MySQL 必知必会”&#xff0c;旨在review“MySQL创建字段数据处理函数汇总数据&#xff08;聚集函数&#xff09;分组数据” 的基础知识&#xff1b;【1】创建计算字段1&#xff09;problemsolution1.1&#xff09;problem&am…

apache.camel_Apache Camel 3.2 – Camel的无反射配置

apache.camel在Apache Camel项目中&#xff0c;我们正在努力开发下一个即将发布的Apache Camel 3.2.0版本。 我们在Camel 3中努力研究的问题之一就是使其变得更小&#xff0c;更快。 其中一个方面是配置管理。 您可以按照12要素原则以多种方式完全配置Camel&#xff0c;以使配…

MySQL数据检索+查询+全文本搜索

【0】README0.1&#xff09;本文部分文字描述转自“MySQL 必知必会”&#xff0c;旨在review“MySQL数据检索查询全文本搜索” 的基础知识&#xff1b;【1】使用子查询1&#xff09;查询定义&#xff1a;任何sql 语句都是查询。但此术语一般指 select语句&#xff1b;SQL 还允许…

selenium自动化测试_49自动化测试中最常见的Selenium异常

selenium自动化测试开发人员将始终在编写代码时牢记不同的场景&#xff0c;但是在某些情况下&#xff0c;实现可能无法按预期工作。 相同的原则也适用于测试代码&#xff0c;该代码主要用于测试现有产品的功能&#xff0c;发现bug并确保产品100&#xff05;不受bug影响。 正确…

MySQL的CRUD操作+使用视图

【0】README0.1&#xff09;本文部分文字描述转自“MySQL 必知必会”&#xff0c;旨在review“MySQL数据检索查询全文本搜索” 的基础知识&#xff1b;【1】插入数据1&#xff09;insert是用来插入&#xff08;或添加&#xff09;行到数据库表的。插入可以用以下几种方式使用&a…

mega x_[MEGA DEAL] 2020年完整的Java Master Class Bundle(96%)

mega x通过超过62个小时的培训来掌握最流行的编程语言&#xff0c;从而树立信誉良好的开发人员职业 嘿&#xff0c;怪胎&#xff0c; 这一周&#xff0c;我们JCG促销专区 &#xff0c;我们有另一个极端的报价 。我们正在提供一个巨大的96&#xff05;off的完整2020 Python编程…

tomcat(11)org.apache.catalina.core.StandardWrapper源码剖析

【0】README0.0&#xff09;本文部分文字描述转自 “how tomcat works”&#xff0c;旨在学习 “tomcat(11)StandardWrapper源码剖析” 的基础知识&#xff1b;0.1&#xff09;StandardWrapper 是 Catalina中对Wrapper接口的标准实现&#xff1b;要知道&#xff0c;tomcat 中有…

lambda表达式语法_使用类似Lambda的语法作为Java中的表达式进行切换

lambda表达式语法从Java 14开始&#xff0c; switch表达式具有其他Lambda式 &#xff08; case ... -> labels &#xff09;语法&#xff0c;它不仅可以用作语句&#xff0c;还可以用作计算为单个值的表达式。 对于新的类似Lambda的语法&#xff0c;如果标签匹配&#xff0…

装饰器模式(讲解+应用)

转载自 设计模式&#xff08;5&#xff09;装饰器模式&#xff08;讲解应用&#xff09;目录 装饰器模式为什么使用装饰器模式应用实例 装饰器模式 看到装饰器是在看《Thinking in Java》一书的时候&#xff0c;看到文件读写那边的时候&#xff0c;有提到装饰器模式&#xff0c…

quarkus_使用Quarkus调试容器中的系统测试(视频)

quarkus如果您能够借助容器在本地进行端到端测试应用程序&#xff0c;则可以提高开发效率。 在下面的视频中&#xff0c;我将展示如何使用Quarkus在Docker容器中调试本地系统测试。 这是我关于有效测试的视频课程的Quarkus扩展。 要全面了解&#xff0c;还可以查看以下资源&a…

MySQL事务管理+安全管理+MySQL数据类型

【0】README0.1&#xff09;本文部分文字描述转自“MySQL 必知必会”&#xff0c;旨在review“MySQL事务管理安全管理MySQL数据类型” 的基础知识&#xff1b;【1】管理事务处理【1.1】事务处理1&#xff09;并非所有引擎都支持事务管理&#xff0c;MyISAM 不支持&#xff0c;而…

超音速 启动_从根本上讲超音速亚原子Enterprise Java

超音速 启动我创建了一个视频&#xff0c;其中我用Quarkus解释了“超音速亚原子Java”&#xff0c;这是现代Java应用程序的运行时。 无论您是刚开始涉足Enterprise Java领域&#xff0c;还是已经是一位经验丰富的Java EE / J2EE开发人员&#xff0c;本课程都将指导您如何在2020…

利用java求积分(定积分和无穷限积分)

【0】README0.1&#xff09;本文部分文字描述转自或译自 https://en.wikipedia.org/wiki/Simpson%27s_rule和 https://en.wikipedia.org/wiki/Numerical_integration#Methods_for_one-dimensional_integrals&#xff1b;旨在利用java求积分&#xff1b;&#xff08;定积分和无穷…

Java的三种代理模式

转载自 Java的三种代理模式1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的…

后台审核管理 ergo_Kogito,ergo规则:从知识到服务,轻松自如

后台审核管理 ergo欢迎阅读有关Kogito倡议的博客系列的另一集&#xff0c;以及我们将Drools带入云的努力。 这些文章的目的是收集用户对我们提供给Kogito的功能的早期反馈。 在本文中&#xff0c;我们介绍了两种实现完整智能服务的新方法 &#xff1a; 独立的规则服务 集成智…

java转换文本文件到xlsx(自制缓冲区,无需先验文件行数)

【0】README0.1&#xff09;本文代码利用了 Apache POI 框架 建立 java 到 xlsx 代码的联系&#xff1b;0.2&#xff09;本文自制缓冲区从文本文件中读取数据读取&#xff0c;无需先验文件行数&#xff1b;0.3&#xff09;本文通过缓冲区大小创建数组&#xff0c;数组容量自动增…

spring react_使用Spring WebFlux构建React性REST API –第3部分

spring react在上一篇文章的续篇中&#xff0c;我们将看到一个应用程序以公开React性REST API。 在此应用程序中&#xff0c;我们使用了 带有WebFlux的Spring Boot 具有响应式支持的Cassandra的Spring数据 卡桑德拉数据库 下面是应用程序的高级体系结构。 让我们看一下bui…

tomcat(12)org.apache.catalina.core.StandardContext源码剖析

【0】README0&#xff09;本文部分文字描述转自 “how tomcat works”&#xff0c;旨在学习 “tomcat(12)StandardContext源码剖析” 的基础知识&#xff1b;1&#xff09;Context实例表示一个具体的web 应用程序&#xff0c;其中包含一个或多个Wrapper实例&#xff0c;每个Wra…

jms面试题_最新的20多个JMS面试问答(2020)

jms面试题快速浏览JMS&#xff08;Java消息服务&#xff09;常见问题面试问题和答案。 2020年以来的最新问题已添加到列表中。 1.简介 在本教程中&#xff0c;我们将了解2020年经常问到的JMS面试问题。作为面试的一部分&#xff0c;如果您有6年以上的经验&#xff0c;就有机会…