建造者模式是一种常用的设计模式,它可以将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在Java中,建造者模式通常通过Builder类来实现。评测编程专家对建造者模式进行了深入解析,指出了其优点和缺点。建造者模式可以提高代码的可读性和可维护性,但也可能导致代码变得过于复杂。在使用建造者模式时需要权衡利弊,根据具体情况进行选择。
在计算机科学和编程领域,设计模式是一种被广泛接受和应用的解决方案,用于解决特定类型的问题,这些模式提供了一种可重用的代码结构,可以帮助开发人员更有效地编写代码,本文将详细介绍一种常见的设计模式——建造者模式。
建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种链式调用的方式来构建复杂对象,这种模式的主要思想是将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示,建造者模式通常用于创建具有多个组成部分的对象,特别是当对象的表示和表示之间的转换成本较高时。
建造者模式的核心角色包括四个部分:
1、产品(Product):这是一个不可变的对象,它的状态在构造过程中不会发生改变,产品类通常是抽象的,具体的产品类需要由子类实现。
2、抽象建造者(AbstractBuilder):这是一个抽象类,它定义了创建产品的方法,抽象建造者不能直接实例化,需要通过具体建造者来实例化。
3、具体建造者(ConcreteBuilder):这是一个实现了抽象建造者接口的具体类,它负责创建产品的各个组成部分,具体建造者可以通过调用产品类的方法来设置对象的状态。
4、指挥者(Director):这是一个负责协调工作的人,它负责将具体的建造者与产品关联起来,并在适当的时机调用相应的方法来完成对象的构建,指挥者通常也是抽象建造者接口的实现者。
下面我们通过一个简单的例子来说明如何使用建造者模式,假设我们要创建一个表示电脑的类,它包含CPU、内存和硬盘等组成部分,我们可以使用建造者模式来实现这个类的构建过程。
我们定义一个表示电脑的产品类:
public class Computer { private String cpu; private int memory; private String hardDisk; public void setCpu(String cpu) { this.cpu = cpu; } public void setMemory(int memory) { this.memory = memory; } public void setHardDisk(String hardDisk) { this.hardDisk = hardDisk; } @Override public String toString() { return "Computer [cpu=" + cpu + ", memory=" + memory + ", hardDisk=" + hardDisk + "]"; } }
我们定义一个抽象的建造者类:
public abstract class Builder { protected Product product = new Computer(); public abstract void buildCpu(); public abstract void buildMemory(); public abstract void buildHardDisk(); public Product getResult() { return product; } }
我们定义两个具体的建造者类,分别用于创建CPU、内存和硬盘:
public class CpuBuilder extends Builder { @Override public void buildCpu() { product.setCpu("Intel Core i7"); } } public class MemoryBuilder extends Builder { @Override public void buildMemory() { product.setMemory(16); } } public class HardDiskBuilder extends Builder { @Override public void buildHardDisk() { product.setHardDisk("SSD"); } }
我们定义一个指挥者类,用于协调工作:
public class Director implements Builder { private List<Builder> builders = new ArrayList<>(); public Director(Builder... builders) { for (Builder builder : builders) { this.builders.add(builder); } } @Override public void buildCpu() { for (Builder builder : builders) { ((CpuBuilder) builder).buildCpu(); } } @Override public void buildMemory() { for (Builder builder : builders) { ((MemoryBuilder) builder).buildMemory(); } } @Override public void buildHardDisk() { for (Builder builder : builders) { ((HardDiskBuilder) builder).buildHardDisk(); } } }
我们可以使用指挥者类来创建一个电脑对象:
public class TestBuilderPatternDemo { public static void main(String[] args) throws ExceptionException, FileNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, UnsupportedOperationException, ExceptionInInitializerError, SecurityException, NoSuchFieldException, ClassNotFoundException, IllegalArgumentException, ArithmeticException, Exception {} catch (Exception e) {} finally {} System.out.println("---------------测试开始----------------"); Builder cpb = new CpuBuilder(); cpb.buildCpu(); Builder mbb = new MemoryBuilder(); mbb.buildMemory(); Builder hdb = new HardDiskBuilder(); hdb.buildHardDisk(); Builder db = new Director(cpb, mbb, hdb); Computer computer = db.getResult(); cpb.buildCpu(); cpb.buildMemory(); cpb.buildHardDisk(); System.out.println(computer); System.out.println("---------------测试结束----------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out.println("-----------------------------------------"); System.out