生成器设计模式的应用

嗨,您好!

今天,我将分享我制作的全新设计模式系列的第一个。 构建器设计模式是开发严肃的应用程序时非常有用且通用的模式。 在这篇文章中,我将提供一个很小的构建器模式框架,因此您随时可以回到这里并使用它。

助记符在处理构建器模式时会考虑自定义。 当我确定应该使用它还是最好去工厂时,我总是会考虑它。 这样对我更好。 尝试一下。

UML

这是小框架的外观。 简单,美观和直接。

建造者

背后的代码

该代码也非常简单,小巧,简洁且易于解释。 我喜欢编码表达力强的代码,因此无需过多评论。 在此示例中,我这样做了,因为它具有教程角色。 在开发过程中,我为自己建立了一些约定。 我认为这样做非常重要。 就像在开发时在语言上应用正确的语法一样。

例如:如果我使用的是Builder模式,我总是将后缀Builder放在最后。 好吧,您现在可以说或想:什么? 但这实际上对于初学者和经验丰富的开发人员来说是非常非常重要的信息。 他们将自动看到其背后的想法,并尝试不破坏其模式。 实际上,经验丰富的开发人员会喜欢它并尝试继续进行出色的工作,因为他们知道编写此内容的开发人员知道他的所作所为,并且肯定有原因。

因此,请始终保持足够的清晰,并在正确的位置提供正确的信息。 稍后会有其他人感谢您。 但是现在到代码了...

// 1. EXAMPLE: PARTS OF THE CUSTOMIZABLE PRODUCT WE WANT
public interface Part {// DEFINE THE METHODS YOUR PARTS WILL HAVE...void anyMethodNameYouLike();
}// 2. THE BUILDER METHOD WILL ADD 
// PARTS RETURNING THE BUILDER ITSELF
public interface BuildContract < B > {B mount(Part part);
}// 3. DEFINE THE BUILDER'S CONTRUCTION METHOD
// WHICH BUILDS AND RETURNS THE FINAL PRODUCT "T"
public interface Builder < T > extends BuildContract < Builder < T > > {T build();
}

一个真实的例子

没有什么比修复和更好地理解它更好的了。 让我们建立一个蛋糕面包店。 您的一位同事想开一家面包店,并要求您为他编写面包店的软件。 我们开始做吧..!

顺便说一句,我衷心地向您推荐,使用UML图表工具是一种可视化机制,可以显示您的想法并提高您的设计技能。 让我们从UML开始:

builder_zh

比喻

现在,让我们使用我们的微型框架,对我们的面包店进行类比。 成分是零件,配方是BuilderContract,而Builder是建造者本身。 Cake是最终的可定制产品。 CakeBuilder是在定制后实际创建产品的类(添加所需数量的零件-成分后)。 客户将是最终客户或接受订单的您的同事。 只是使用或发挥想象力...现在让我们深入研究代码...

成分(部分)

我们示例中的部分是成分。 让我们实现一些成分,以后再用它来制作蛋糕。

// 1. EXAMPLE: PART TO CUSTOMIZATE "INGREDIENTS"
public interface Ingredient {// INGREDIENTS WILL HAVE...void printName();String getUnitPrice();void printCalories();
}
public class LightMilk implements Ingredient {private int deciLiter;private int calories;private String unitPrice;public LightMilk(int deciLiter){this.deciLiter=deciLiter;}public LightMilk(int deciLiter, int calories, String unitPrice) {super();this.deciLiter = deciLiter;this.calories = calories;this.unitPrice = unitPrice;}@Override public void printName() {System.out.printf(" Light Milk");}@Override public String getUnitPrice() {return unitPrice;}@Override public void printCalories() {System.out.printf(" 76kc");}public int getDeciLiter() {return deciLiter;}public void setDeciLiter(int deciLiter) {this.deciLiter = deciLiter;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public void setUnitPrice(String unitPrice) {this.unitPrice = unitPrice;}
}
public class Sugar implements Ingredient {private int gram;private int calories;private String unitPrice;public Sugar(int deciLiter){this.gram=deciLiter;}public Sugar(int gram, int calories, String unitPrice) {super();this.gram = gram;this.calories = calories;this.unitPrice = unitPrice;}@Override public void printName() {System.out.printf(" Sugar");}@Override public String getUnitPrice() {return unitPrice;}@Override public void printCalories() {System.out.printf(" 40kc");}public int getGram() {return gram;}public void setGram(int gram) {this.gram = gram;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public void setUnitPrice(String unitPrice) {this.unitPrice = unitPrice;}
}
public class Choco implements Ingredient {private int gram;private int calories;private String unitPrice;public Choco(int gram, int calories, String unitPrice) {super();this.gram = gram;this.calories = calories;this.unitPrice = unitPrice;}public int getGram() {return gram;}public void setGram(int gram) {this.gram = gram;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public void setUnitPrice(String unitPrice) {this.unitPrice = unitPrice;}@Override public void printName() {System.out.printf(" Chocolate");}@Override public void printCalories() {System.out.printf(" 389kc");}@Override public String getUnitPrice() {return unitPrice;}
}
public class NoSugar implements Ingredient {private int gram;private int calories;private String unitPrice;public NoSugar(int deciLiter){this.gram=deciLiter;}public NoSugar(int gram, int calories, String unitPrice) {super();this.gram = gram;this.calories = calories;this.unitPrice = unitPrice;}@Override public void printName() {System.out.printf(" No Sugar");}@Override public String getUnitPrice() {return unitPrice;}@Override public void printCalories() {System.out.printf(" 0kc");}public int getGram() {return gram;}public void setGram(int gram) {this.gram = gram;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public void setUnitPrice(String unitPrice) {this.unitPrice = unitPrice;}
}
public class Milk implements Ingredient {private int deciLiter;private int calories;private String unitPrice;public Milk(int deciLiter){this.deciLiter=deciLiter;}public Milk(int deciLiter, int calories, String unitPrice) {super();this.deciLiter = deciLiter;this.calories = calories;this.unitPrice = unitPrice;}@Override public void printName() {System.out.printf(" Milk");}@Override public String getUnitPrice() {return unitPrice;}@Override public void printCalories() {System.out.printf(" 128kc");}public int getDeciLiter() {return deciLiter;}public void setDeciLiter(int deciLiter) {this.deciLiter = deciLiter;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public void setUnitPrice(String unitPrice) {this.unitPrice = unitPrice;}
}

建筑商合同

这是我们示例中的食谱。

// 2. THE BUILDER METHOD WILL ADD 
// INGREDIENTS RETURNING THE BUILDER ITSELF
public interface Recipe < B > {B addIngredient(Ingredient ingredient);
}
// 3. DEFINE THE BUILDER CONTRUCTION METHOD
// WHICH BUILDS AND RETURNS THE FINAL PRODUCT "T"
public interface Builder < T > extends Recipe < Builder < T > > {T build();
}
import java.util.ArrayList;
import java.util.List;
// 4. IMPLEMENT THE BUILDER ACC. TO YOUR NEEDS
public class CakeBuilder implements Builder < Cake > {// IN THIS CASE THE PARTS ARE THE INGREDIENTSprivate List < Ingredient > ingredients=new ArrayList < Ingredient > ( );@Overridepublic Cake build() {if(!ingredients.isEmpty()){// THE FINAL PRODUCT IS A CHOCO-MUFFINreturn new Cake(ingredients);}return new Cake(null);}@Override// BECAUSE I ALWAYS GET A BUILDER BACK, I'M ABLE TO// ADD A LOT OF PARTS BEFORE I CALL "BUILD()"public Builder < Cake > addIngredient(Ingredient ingredient) {if(ingredient!=null){ingredients.add(ingredient);}return this;}
}

产品

在我们的示例中,要构建的产品是蛋糕。

import java.util.List;public class Cake {public Cake(List < Ingredient > ingredients){String muffin = "";if(ingredients==null){System.out.println(" zero cake "+muffin);return;}// PRINT OUT MUFFIN INGREDIENTSSystem.out.printf(" Cake with: ");for (Ingredient ingredient : ingredients) {ingredient.printName();}// PRINT OUT PART PRICESfor (Ingredient ingredient : ingredients) {muffin+=" "+ingredient.getUnitPrice();//NOPMD}System.out.println(" - Price: "+muffin);}public void printResult(){System.out.println(" Cake is ready!");}
}

测试它

最后客户端测试。 在这里我们可以看到它的用法:

// 5. TESTING THE CHOCO-BUILDER
public class Client {public static void main(String[] args) {Builder < Cake > chocoMuffinBuilder = new CakeBuilder();chocoMuffinBuilder.addIngredient(new Choco(10, 23, "3.39"));chocoMuffinBuilder.addIngredient(new Milk(34, 67, "1.57"));chocoMuffinBuilder.addIngredient(new Sugar(34, 67, "2.00"));final Cake chocoMuffin = chocoMuffinBuilder.build();chocoMuffin.printResult();}
}

就这样! 希望你喜欢!

翻译自: https://www.javacodegeeks.com/2014/08/builder-design-pattern-applied.html

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

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

相关文章

知识整理2019清北学堂提高储备D5

今天主讲图论。 前言&#xff1a;图的定义&#xff1a;图G是一个有序二元组(V,E)&#xff0c;其中V称为顶集(Vertices Set)&#xff0c;E称为边集(Edges set)&#xff0c;E与V不相交。它们亦可写成V(G)和E(G)。 一、图的存储&#xff1a; 1、邻接矩阵&#xff1a; 2、邻接表&am…

CSS之文字溢出处理

1.单行文本之三剑客<p>刘诗诗&#xff0c;原名刘诗施&#xff0c;1987年3月10日出生于北京市&#xff0c;中国内地影视女演员、影视出品人。</p>p{border: 1px solid red;width: 400px;height: 40px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis…

GA,RC,Alpha,Beta,Final等软件版本名词释义

对应上图的表格如下&#xff1a; 名词&#xff01;说明Alphaα是希腊字母的第一个&#xff0c;表示最早的版本&#xff0c;内部测试版&#xff0c;一般不向外部发布&#xff0c;bug会比较多&#xff0c;功能也不全&#xff0c;一般只有测试人员使用。Betaβ是希腊字母的第二个&…

HawtIO在JBoss EAP上(第二部分)

我刚刚发布了一篇关于在JBoss Wildfly 8.1上运行HawtIO的条目 。 从那篇文章中&#xff0c;您将了解HawtIO多么出色 &#xff0c;以及它必须具备的所有 出色 插件&#xff0c;才能从单个仪表板管理基于JVM的技术……好吧…… hawt ……。 但是&#xff0c;出于上一篇文章中概述…

Mule ESB,ActiveMQ和DLQ

在本文中&#xff0c;我将展示一个简单的Mule ESB流程&#xff0c;以了解实际中使用的Active MQ 的DLQ功能 。 我假设您有一个正在运行的Apache ActiveMQ实例&#xff08;如果没有&#xff0c;则可以在此处下载一个版本&#xff09;。 在此示例中&#xff0c;我使用了Mule ESB…

Choose and Divide UVa 10375

题目大意&#xff1a;给出p,q,r,s&#xff0c;求组合数C(p,q)/C(r,s) 题目思路&#xff1a; 化简得到&#xff1a;原式等价于(p!(r-s)!s!) / (r!(p-q)!q!) 由算数基本定理可知任意一个正整数可被唯一分解为素数幂乘积的形式&#xff0c;将分子分母分解后&#xff0c;进行约分即…

Linux sudo 详解

简单的说&#xff0c;sudo 是一种权限管理机制&#xff0c;管理员可以授权于一些普通用户去执行一些 root 执行的操作&#xff0c;而不需要知道 root 的密码。严谨些说&#xff0c;sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然&#xff0c;能做什么…

echarts自定义图例legend文字和样式

话不多说&#xff0c;先上效果图。 要完成这个图并不难&#xff0c;主要是下面那个图例比较难&#xff0c;需要定制。 让我们从官方文档找找思路&#xff0c;官方文档关于legend.formatter是这样的&#xff1a;链接在这 难点在于&#xff1a; 1.这里的图例文本包含两个变量&am…

【题解】整理书本

题目描述 小A想把他满屋子的书整理一下。书本分成若干堆。每一堆的书本都有质量w和价值v。小A的任务是将所有书合成一堆。因为小A认为合并i&#xff0c;j两堆的书所需要的力为w[i]-v[i]w[j]-v[j]。合并后的书堆的质量和价值均为合并前两堆书的质量和价值的总和。也就是说&#…

JBoss Wildfly 8.1上的HawtIO

HawtIO为基于JVM的中间件提供了令人赞叹的视觉效果。 它是应用程序的统一控制台&#xff0c;否则将不得不构建自己的糟糕的Web控制台。 老实说&#xff0c;它们的构建方式各不相同&#xff0c;技术不同&#xff0c;用户体验不同&#xff0c;并且都围绕一种可怕的方式来尝试在QA…

jsp实现上一页下一页翻页功能

前段时间一直忙于期末考试和找实习&#xff0c;好久没写博客了。 这段时间做了个小项目&#xff0c;包含了翻页和富文本编辑器Ueditor的两个知识点,Ueditor玩的还不是很深&#xff0c;打算玩深后再写篇博客。 要实现翻页功能&#xff0c;只需要设置一个pageIndex即可&#xf…

自定义Cassandra数据类型

在博客文章《 从Java连接到Cassandra》中 &#xff0c;我提到了用Java 实现的Cassandra Java开发人员的一个优势是能够创建自定义 Cassandra数据类型 。 在这篇文章中&#xff0c;我将详细介绍如何执行此操作。 Cassandra具有许多内置的数据类型 &#xff0c;但是在某些情况下…

Docker的安装及注意事项

Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#…

基于CSS的个人网页

前端时间做的CSS作业&#xff1a;基于CSS的个人网页 基于CSS的个人网页 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>吴广林的个人博客</title><link rel"styles…

Java验证(javafx)

验证是核心javafx框架所缺少的一件事。 为了填补这一空白&#xff0c; controlsfx中已经存在一个第三方验证库 。 但是&#xff0c;我有一个问题&#xff1a;它不是在考虑FXML的情况下创建的。 这并不是说它不是一个很好的库&#xff0c;只是错过了这个细节&#xff0c;对我来说…

WAP自助建站 我编程之路的启蒙

如题所示的这篇文章是我心血来潮在网上搜索到的&#xff0c;写的挺让我感同身受的&#xff0c;不妨先看一下原文吧。 原文 不知是偶然还是“冥冥定数”&#xff0c;最后一次访问娃派建站&#xff08;wap.ai&#xff09;已有数十月之久了&#xff0c;突然心血来潮想看看曾经的建…

初始socket模块和巧解粘包问题

1.什么是socket&#xff1f; 两个进程如果需要进行通讯最基本的一个前提能够唯一的标示一个进程&#xff0c;在本地进程通讯中我们可以使用PID来唯一标示一个进程&#xff0c;但PID只在本地唯一&#xff0c;网络中的两个进程PID冲突几率很大&#xff0c;这时候我们需要另辟它径…

webpack常用loader和plugin及打包速度优化

优化 或 也可以用&#xff1a; 备用&#xff1a; 慎用的配置&#xff0c;用的不好会增加打包时间&#xff1a; 代码丑化插件&#xff1a; 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

react-native 热更新react-native-pushy集成遇到的问题

主要步骤按官方文档实现&#xff0c;这里只记录遇到的一些小坑 官方文档 run-android时NDK报错 前提是NDK已安装并且环境变量已设置 根据报错提示在 android/local.properties文件里加入ndk.dir~/Library/Android/android-ndk-r10e //这里改成你自己的ndk路径 cxxbridge找…

Keil5 仿真测试出现Cannot Load Flash Device Description 解决方法

1.用ST的烧录软件检测&#xff0c;可以烧录对应的Hex文件。 2.点击魔术棒&#xff0c;Debug选项卡检测芯片型号是否和当前芯片对应 3.在Flash Download选项卡中检查发现没有对应的芯片型号 4.点击Add 选项&#xff0c;选择对应的Flash类型如图&#xff1a; 添加Flash类型后&…