设计模式:建造模式(组装电脑)
作者:互联网
一. 实验目的
- 了解建造模式创建复杂对象的基本思路和方法,熟悉该模式中各个对象角色的基本功能。
- 理解建造模式在进行复杂对象创建中,是如何实现复杂对象的构建过程与表示分离的。
- 熟悉建造模式的类图结构,并能利用该模式实现较为复杂对象的创建。
二. 实验内容
通过如下对组装电脑的装配与获取过程描述,设计一个建造模式应用的场景。
- 销售人员来询问所装机器的配置
- 确定配置清单
- 准备装机配件
- 技术人员按组装流程装配相应电脑
- 整机交给客户
在上述场景中确定模式应用的各个角色,并以配置的电脑主机作为所需的产品对象,进行产品创建。在该场景中,对于电脑主机的装配简化为如下5个标准步骤,作为创建该产品的基本过程。
- 将主板固定在机箱中(SetupMainBoard)
- 将CPU安装到主板上(SetupMainCPU)
- 将内存安装到主板上(SetupMemory)
- 将硬盘连接到主板上(SetupHardDisk)
- 将显卡安装到主板上(SetupVioeoCard)
并设置两种主机产品的表现形式,即办公主机(OfficeComputer)与游戏主机(GameComputer)。
三. 实验过程
应用场景:
实现计算机的组装:用户去购买计算机时,销售人员会来询问所装机器的配置,可以根据自己的需要选购计算机的CPU、内存条、显卡、主板、硬盘等各个配件,在确定配置清单后,商家开始准备装机的配件,准备完成后,技术人员按组装流程装配相应电脑,最后会把装好的整机交给客户,用建造者模式解决这个问题。
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
类图
结构与实现
建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。
- 产品角色(Product):
1.表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
2.包含定义组成部件的类,包括将这些部件配成最终产品的接口。 - 抽象建造者(Builder):为创建一个Product对象的各个部件指定抽象接口。
- 具体建造者(ConcreteBuilder):
1.实现Builder的接口以构造和装配该产品的各个部件。
2.定义并跟踪它所创建的表示。
3.提供一个检索产品的接口(例如,GetACIIText和GetTextWidget)。 - 指挥者(Director):构造一个被使用Builder接口的对象。
抽象建造者(Builder)
使用抽象类定义对应用场景电脑的重要部件的定义:
public abstract class Builder {
protected String name;
protected Computer computer;
public String getname(){
return name;
}
public void setname(String str){
name=str;
}
public Computer getcomputer(){
return computer;
}
public void setcomputer(Computer com){
computer=com;
}
public Builder(){
computer=new Computer();
}
public abstract void setupMainBoard();
public abstract void setupCPU();
public abstract void setupHardDisk();
public abstract void setupMemory();
public abstract void setupVideoCard();
}
具体建造者(ConcreteBuilder)
电脑的抽象定义出来了,接下来就要定义具体的组装,在这里设置了两种主机产品的表现形式,即办公主机(OfficeComputer)与游戏主机(GameComputer)。
- 办公主机(OfficeComputer)的具体定义:
package Demo;
public class OfficeComputerBuilder extends Builder {
public void setupMainBoard(){
computer.setMainBoard("办公电脑主板");
}
public void setupCPU(){
computer.setCPU("办公电脑处理器");
}
public void setupHardDisk(){
computer.setHardDisk("办公电脑硬盘");
}
public void setupMemory(){
computer.setMemory("办公电脑内存");
}
public void setupVideoCard(){
computer.setVideoCard("办公电脑显卡");
}
}
- 游戏主机(GameComputer)的具体定义:
package Demo;
public class GameComputerBuilder extends Builder{
public void setupMainBoard(){
computer.setMainBoard("游戏电脑主板");
}
public void setupCPU(){
computer.setCPU("游戏电脑处理器");
}
public void setupHardDisk(){
computer.setHardDisk("游戏电脑硬盘");
}
public void setupMemory(){
computer.setMemory("游戏电脑内存");
}
public void setupVideoCard(){
computer.setVideoCard("游戏电脑显卡");
}
}
产品角色(Product)
电脑已经定义好了,还有电脑产品的产品定义,表示被构建的复杂对象:
package Demo;
public class Computer {
private String MainBoard;
private String CPU;
private String Memory;
private String HardDisk;
private String VideoCard;
public String getMainBoard(){
return MainBoard;
}
public void setMainBoard(String str){
MainBoard=str;
}
public String getCPU(){
return CPU;
}
public void setCPU(String str){
CPU=str;
}
public String getMemory(){
return Memory;
}
public void setMemory(String str){
Memory=str;
}
public String getHardDisk(){
return HardDisk;
}
public void setHardDisk(String str){
HardDisk=str;
}
public String getVideoCard(){
return VideoCard;
}
public void setVideoCard(String str){
VideoCard=str;
}
public void ShowSysInfo(){
System.out.println("=======主机部件配置信息=======");
System.out.println("主板类型:"+MainBoard);
System.out.println("CPU类型:"+CPU);
System.out.println("内存类型:"+Memory);
System.out.println("硬盘类型:"+HardDisk);
System.out.println("显卡类型:"+VideoCard);
}
}
指挥者(Director)
指挥者定义,我们需要添加一个指挥者类,可以规范这个对象的创建,可以将复杂对象的创建和具体开来,用于构建复杂对象。通过指挥者帮助我们创建好实例:
package Demo;
//指定者定义,负责调度创建具体对象,创建实例
public class ComputerFactory {
public void BuildComputer(Builder cb){
System.out.println("开始组装部件>>>");
cb.setupMainBoard();
cb.setupCPU();
cb.setupHardDisk();
cb.setupMemory();
cb.setupVideoCard();
System.out.println(">>>主机组装完成");
}
}
客户端应用(Program)
建造模式的外部客户端(Program)根本不需要知道其内部的具体细节,技术人员把客户需要的电脑组装好的整机给到客户,客户看的最终的电脑主机配置信息。
- 假设是游戏主机(GameComputer)
package Demo;
//客户端应用
public class Program {
public static void main(String[] args) {
// TODO 自动生成的方法存根
ComputerFactory cf=new ComputerFactory();
GameComputerBuilder gc=new GameComputerBuilder();
cf.BuildComputer(gc);
gc.getcomputer().ShowSysInfo();
}
}
- 假设是办公主机(OfficeComputer)
package Demo;
//客户端应用
public class Program {
public static void main(String[] args) {
// TODO 自动生成的方法存根
ComputerFactory cf=new ComputerFactory();
OfficeComputerBuilder oc=new OfficeComputerBuilder();
cf.BuildComputer(oc);
oc.getcomputer().ShowSysInfo();
}
}
四.调试和运行结果
使用者客户端假设是配置的游戏主机,调用的是具体建造定义GameComputerBuilder那么最终的显示信息是:
使用者客户端假设是配置的办公主机,调用的是具体建造定义OfficeComputerBuilder那么最终的显示信息是:
总结
建造者模式的出现就是为了避免复杂对象的创建过程出现其他问题而出现的。通过对建造模式的这次学习,了解并掌握了建造模式的四个参与者:产品角色(Product)、抽象建造者(Builder)、具体建造者(ConcreteBuilder)指挥者(Director)的基本功能。
标签:String,Builder,建造,void,组装,电脑,computer,设计模式,public 来源: https://blog.csdn.net/m0_52406075/article/details/123641359