Java设计模式10,建造者模式
目录
- 一、建造者模式
- 二、建造者模式的结构
- 1、抽象建造者(Builder)
- 2、具体建造者(ConcreteBuilder)
- 3、指挥者(Director)
- 4、产品(Product)
- 三、建造者模式的优缺点
- 1、优点
- 2、缺点
- 四、违背原则方案
- 1、电脑接口
- 2、主机
- 3、显示器
- 4、键盘
- 5、鼠标
- 6、组装电脑
- 7、控制台显示
- 五、建造者模式改善代码
- 1、电脑接口
- 2、组装电脑实现类
- 3、建造者方法
- 4、控制台显示
一、建造者模式
通俗的讲,比如你想组装一个电脑,需要机箱、显示器、键盘、鼠标,但是它们选取的品牌各异,最终的电脑价格和性能又是天差地别。
而这样的根据相同的配件,不同的组装所产生出的具体的内容,就是建造者模式的具体实现,也就是将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
二、建造者模式的结构
1、抽象建造者(Builder)
它声明为创建一个产品对象的各个部件指定的抽象接口,在该接口中一般声明两类方法,一类方法是buildPatX(),他们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。
2、具体建造者(ConcreteBuilder)
实现抽象建造者接口,构建和装配各个部件,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
3、指挥者(Director)
它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()构造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者setter方法将该对象传入指挥者类中。它主要是用于创建一个复杂对象,它主要有两个作用①隔离了客户与对象的生成过程②负责控制产品对象的生产过程。
4、产品(Product)
产品角色,一个具体的产品对象。
三、建造者模式的优缺点
1、优点
- 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
- 每一个具体建造者都相对独立,而与其它的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”。
- 可以更加精细的控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
2、缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。
四、违背原则方案
比如你想组装一个电脑,需要机箱、显示器、键盘、鼠标。
1、电脑接口
package com.guor.builder;public interface Computer {// 电脑配件(主机、显示器、键盘、鼠标)String parts();// 品牌String brand();// 型号String model();// 价格Double price();// 描述String desc();
}
2、主机
(1)ROG主机
package com.guor.builder;public class RogHost implements Computer{@Overridepublic String parts() {return "主机";}@Overridepublic String brand() {return "ROG";}@Overridepublic String model() {return "光刃G15";}@Overridepublic Double price() {return 13999.00;}@Overridepublic String desc() {return "Intel i7-12700 16G 1TB+1TSSD RTX3070 8G独显";}
}
(2)拯救者主机
package com.guor.builder;public class LegionHost implements Computer {@Overridepublic String parts() {return "主机";}@Overridepublic String brand() {return "Lenovo";}@Overridepublic String model() {return "拯救者刃7000K";}@Overridepublic Double price() {return 6999.00;}@Overridepublic String desc() {return "Intel i5-12400F 16G 512G SSD RTX3060";}
}
3、显示器
(1)ROG32寸显示器
package com.guor.builder;public class Rog32Monitor implements Computer{@Overridepublic String parts() {return "显示器";}@Overridepublic String brand() {return "ROG";}@Overridepublic String model() {return "华硕PG32UG";}@Overridepublic Double price() {return 7499.00;}@Overridepublic String desc() {return "32寸 游戏显示器4K 144Hz HDR600";}
}
(2)ROG27寸显示器
package com.guor.builder;public class Rog27Monitor implements Computer {@Overridepublic String parts() {return "显示器";}@Overridepublic String brand() {return "ROG";}@Overridepublic String model() {return "华硕XG276Q";}@Overridepublic Double price() {return 1899.00;}@Overridepublic String desc() {return "27寸 电竞显示器 170Hz HDR400";}
}
(3)三星显示器
package com.guor.builder;public class SamsungMonitor implements Computer {@Overridepublic String parts() {return "显示器";}@Overridepublic String brand() {return "三星";}@Overridepublic String model() {return "三星S27R350FHC";}@Overridepublic Double price() {return 999.00;}@Overridepublic String desc() {return "27寸 IPS 便携显示器 75HZ";}
}
4、键盘
(1)ROG机械键盘
package com.guor.builder;public class RogKeyboard implements Computer {@Overridepublic String parts() {return "键盘";}@Overridepublic String brand() {return "ROG";}@Overridepublic String model() {return "龙骑士2";}@Overridepublic Double price() {return 1899.00;}@Overridepublic String desc() {return "机械键盘 双模 可分离式 104键 RGB背光 RX光轴";}
}
(2)罗技机械键盘
package com.guor.builder;public class LogitechKeyboard implements Computer {@Overridepublic String parts() {return "键盘";}@Overridepublic String brand() {return "Logitech";}@Overridepublic String model() {return "G610";}@Overridepublic Double price() {return 479.00;}@Overridepublic String desc() {return "cherry机械键盘 有线 104键 电竞游戏背光";}
}
5、鼠标
(1)ROG鼠标
package com.guor.builder;public class RogMouse implements Computer {@Overridepublic String parts() {return "鼠标";}@Overridepublic String brand() {return "ROG";}@Overridepublic String model() {return "战刃3";}@Overridepublic Double price() {return 599.00;}@Overridepublic String desc() {return "无限版 三模鼠标 RGB灯效可换微动26000DPI";}
}
(2)罗技鼠标
package com.guor.builder;public class LogitechMouse implements Computer {@Overridepublic String parts() {return "鼠标";}@Overridepublic String brand() {return "Logitech";}@Overridepublic String model() {return "G402";}@Overridepublic Double price() {return 199.00;}@Overridepublic String desc() {return "有线鼠标 高速追踪FPS";}
}
6、组装电脑
package com.guor.builder;import java.util.ArrayList;
import java.util.List;public class PackageComputer {public static String getComputerList(String name, Integer grade) {// 配件清单List<Computer> list = new ArrayList<Computer>();// 组装价格Double price = 0.00;// ROG套装if(grade == 1){RogHost host = new RogHost();Rog32Monitor monitor = new Rog32Monitor();RogKeyboard keyboard = new RogKeyboard();RogMouse mouse = new RogMouse();list.add(host);list.add(monitor);list.add(keyboard);list.add(mouse);price = host.price()+monitor.price()+keyboard.price()+mouse.price();}else if(grade == 2){// ROG机箱 + 27寸显示器 + 罗技键鼠RogHost host = new RogHost();Rog27Monitor monitor = new Rog27Monitor();LogitechKeyboard keyboard = new LogitechKeyboard();LogitechMouse mouse = new LogitechMouse();list.add(host);list.add(monitor);list.add(keyboard);list.add(mouse);price = host.price()+monitor.price()+keyboard.price()+mouse.price();}else if(grade == 3){// Legion机箱 + 三星显示器 + 罗技键鼠LegionHost host = new LegionHost();SamsungMonitor monitor = new SamsungMonitor();LogitechKeyboard keyboard = new LogitechKeyboard();LogitechMouse mouse = new LogitechMouse();list.add(host);list.add(monitor);list.add(keyboard);list.add(mouse);price = host.price()+monitor.price()+keyboard.price()+mouse.price();}StringBuilder builder = new StringBuilder();builder.append(name+"组装电脑:\r\n");builder.append("套餐:" + grade + "\r\n");builder.append("套餐价格:" + price + " 元\r\n");builder.append("配件清单:\r\n");for (Computer computer : list) {builder.append(computer.parts()+"、");builder.append(computer.brand()+"、");builder.append(computer.model()+"、");builder.append(computer.price()+"、");builder.append(computer.desc()+ "\r\n");}System.out.println("************************");return builder.toString();}public static void main(String[] args) {System.out.println(getComputerList("哪吒",1));System.out.println(getComputerList("敖丙",2));System.out.println(getComputerList("妲己",3));}
}
7、控制台显示
哪吒哥,不差钱!
这代码写的没毛病,根据选择的套餐等级,组装不同配置的电脑,无脑ROG就是爽!
五、建造者模式改善代码
1、电脑接口
组装一个电脑,需要主机、显示器、键盘、鼠标。
package com.guor.builder;public interface IComputer {// 主机IComputer appendHost(Computer computer);// 显示器IComputer appendMonitor(Computer computer);// 键盘IComputer appendKeyboard(Computer computer);// 鼠标IComputer appendMouse(Computer computer);// 电脑清单String getComputerDetail();
}
2、组装电脑实现类
package com.guor.builder;import java.util.ArrayList;
import java.util.List;public class BuilderComputer implements IComputer {// 配件清单private List<Computer> list = new ArrayList<Computer>();// 组装价格private Double price = 0.00;// 姓名private String name;// 套餐private int grade;public BuilderComputer(String name, int grade) {this.name = name;this.grade = grade;}@Overridepublic IComputer appendHost(Computer computer) {list.add(computer);price += computer.price();return this;}@Overridepublic IComputer appendMonitor(Computer computer) {list.add(computer);price += computer.price();return this;}@Overridepublic IComputer appendKeyboard(Computer computer) {list.add(computer);price += computer.price();return this;}@Overridepublic IComputer appendMouse(Computer computer) {list.add(computer);price += computer.price();return this;}@Overridepublic String getComputerDetail() {StringBuilder builder = new StringBuilder();builder.append(name+"组装电脑:\r\n");builder.append("套餐:" + grade + "\r\n");builder.append("套餐价格:" + price + " 元\r\n");builder.append("配件清单:\r\n");for (Computer computer : list) {builder.append(computer.parts()+"、");builder.append(computer.brand()+"、");builder.append(computer.model()+"、");builder.append(computer.price()+"、");builder.append(computer.desc()+ "\r\n");}System.out.println("************************");return builder.toString();}
}
3、建造者方法
package com.guor.builder;public class Builder {public IComputer levelOne(){return new BuilderComputer("哪吒",1).appendHost(new RogHost()).appendMonitor(new Rog32Monitor()).appendKeyboard(new RogKeyboard()).appendMouse(new RogMouse());}public IComputer levelTwo(){return new BuilderComputer("敖丙",2).appendHost(new RogHost()).appendMonitor(new Rog27Monitor()).appendKeyboard(new LogitechKeyboard()).appendMouse(new LogitechMouse());}public IComputer levelThree(){return new BuilderComputer("妲己",3).appendHost(new LegionHost()).appendMonitor(new SamsungMonitor()).appendKeyboard(new LogitechKeyboard()).appendMouse(new LogitechMouse());}public static void main(String[] args) {Builder builder = new Builder();System.out.println(builder.levelOne().getComputerDetail());System.out.println(builder.levelTwo().getComputerDetail());System.out.println(builder.levelThree().getComputerDetail());}
}
4、控制台显示
与上面结果一致。
去掉了繁琐的ifelse,符合单一职责原则、开闭原则,代码可读性、复用性、拓展性强。
很多人觉得设计模式很简单,但是,能够熟练的将设计模式应用在自己的项目中,将各模块、功能规划的井井有条,运用的炉火纯青、恰到好处,真的很难。反复阅读,仔细体会。
设计模式系列文章:
java设计模式1,单一职责原则
java设计模式2,开闭原则
java设计模式3,里氏替换原则
java设计模式4,不要和陌生人说话
java设计模式5,接口隔离原则
Java设计模式6,依赖倒置原则
java设计模式7,工厂方法模式
Java设计模式8,校验、审批流程改善神器,责任链模式
一篇打通架构设计,Java设计模式9,模板方法模式
Java设计模式10,建造者模式相关推荐
- java设计模式之建造者模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- Java设计模式(建造者模式-适配器模式-桥接模式)
Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- java设计模式 建造模式_理解java设计模式之建造者模式
理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...
- JAVA设计模式之建造者模式
转自 JAVA设计模式之建造者模式 建造者模式(Builder)的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂对象的创建型 ...
- 一文弄懂Java设计模式之建造者模式:图解+游戏角色生成实例
文章目录 详解Java设计模式之建造者模式 案例引入建造者模式 建造者模式 定义 UML类图表示 模式结构 案例分析与代码实现 案例类图实现 代码结构 代码实现 结果分析 指挥者类的深入讨论 钩子方法 ...
- Java设计模式之建造者模式(精髓版)
目录 1.建造者模式阐述 2.使用Java代码实现建造者模式 3.为什么需要使用建造者模式? 4.建造者模式与工厂方法模式有什么区别? 1.建造者模式阐述 Java 建造者模式是一种创建型设计模式,其 ...
- (设计模式四)java设计模式之建造者模式
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 1.解决的问题 平常一般创建对象,需要new,然后通过set方法给每个属性设置,当创建多个对象的时候,代码重复性 ...
- 【Java设计模式】建造者模式(案例详解)
[辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...
- 【Java设计模式】建造者模式、原型模式
建造者模式 (1)需要建造很多零件 (2)需要装配起来 通常用于构建一些复杂的对象.可能需要和工厂模式互相搭配. • 场景: – 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品 ...
最新文章
- linux 配置 clang++ SDL 开发环境 (新手向)
- 待办事项桌面插件_求一款安卓手机上可添加小目标的桌面便签软件?
- jeesite1.X 集成多数据源
- java异常标记_java.lang.RuntimeException:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误的标记...
- synchronized原理_浅谈synchronized的实现原理
- flask v0.1 flask.py
- 通过一个Thinkphp完成多个项目
- 一个查看Access数据库密码的工具
- 注册表服务器设置mtu,自己修改注册表优化宽带网设置
- 求助:CISCO2811DHCP中继配置
- 新浪igame连连看游戏截图
- 计算机专硕都是数二英二吗,【专硕初试】大改革?英二、数二都不考了?
- 4年产品点滴心路——谈谈形而上的3个产品素质
- 停车场计费算法 php,时段计费算法,一般用于停车计费
- android edittext怎样获取输入的内容,如何获取edittext中输入的内容?
- 关于搭建FTP服务器
- 在Java中打印金字塔图案
- 解决 Performing stop of activity that is not resumed 报错!!
- Html5面试问题总结(精华)
- echarts折线图鼠标悬浮竖线_Echarts折线图问题,鼠标悬停的地方不能正确展示数据怎么回事呢?...