建造者模式是一种常用的设计模式,它可以将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。评测编程专家详解了建造者模式的实现过程和应用场景,并提供了相关的类图。通过使用建造者模式,可以更加灵活地构建复杂对象,提高代码的可维护性和可扩展性。在实际开发中,建造者模式常用于图形界面、数据库表结构等需要灵活配置的情况。
在计算机科学领域,设计模式是一种被广泛应用的解决方案,它们可以帮助开发者解决特定问题,我们将重点讨论一种名为“建造者模式”的设计模式,建造者模式是一种创建型设计模式,它提供了一种在不暴露对象创建细节的情况下创建对象的方法,这种模式通常用于创建复杂对象,特别是当这些对象的构造过程涉及多个步骤或者需要与其他对象进行交互时。
让我们来了解一下建造者模式的基本概念,建造者模式包含以下几个部分:
1、抽象建造者(Builder):这是一个接口,定义了创建对象的方法,所有的建造者类都应该实现这个接口。
2、具体建造者(ConcreteBuilder):这是实现了抽象建造者接口的类,这些类负责创建对象的各个部分,并将它们组合成一个完整的对象。
3、指挥者(Director):这是一个负责控制建造过程的类,它从具体建造者中获取对象的部分,并将它们组合成一个完整的对象,指挥者不需要知道具体的创建过程,只需要知道如何调用具体建造者的相应方法即可。
4、产品(Product):这是我们需要创建的对象,在建造者模式中,产品是一个简单的接口或抽象类,它定义了一个方法用于获取创建好的对象。
让我们通过一个简单的例子来了解如何使用建造者模式,假设我们要创建一个表示电脑的程序,它的属性包括操作系统、处理器和内存大小,我们可以使用建造者模式来实现这个功能,代码如下:
// 抽象产品类 interface Computer { void setOS(String os); void setCPU(String cpu); void setMemory(int memory); String toString(); } // 具体产品类 class ConcreteComputer implements Computer { private String os; private String cpu; private int memory; public void setOS(String os) { this.os = os; } public void setCPU(String cpu) { this.cpu = cpu; } public void setMemory(int memory) { this.memory = memory; } public String toString() { return "OS: " + os + ", CPU: " + cpu + ", Memory: " + memory + "GB"; } } // 具体建造者类1:设置操作系统 class OSBuilder implements Builder { private ConcreteComputer computer; public OSBuilder(ConcreteComputer computer) { this.computer = computer; } public void buildOS(String os) { computer.setOS(os); } } // 具体建造者类2:设置处理器 class CPUBuilder implements Builder { private ConcreteComputer computer; public CPUBuilder(ConcreteComputer computer) { this.computer = computer; } public void buildCPU(String cpu) { computer.setCPU(cpu); } } // 具体建造者类3:设置内存大小 class MemoryBuilder implements Builder { private ConcreteComputer computer; public MemoryBuilder(ConcreteComputer computer) { this.computer = computer; } public void buildMemory(int memory) { computer.setMemory(memory); } } // 总指挥者类,负责组装电脑对象并输出结果信息,同时提供一个静态方法供测试直接调用,该方法返回一个新构建好的电脑对象。<p>完整代码如下:</p> <p>============================================<br></p><pre><code class="language-java">public class DirectorDemo extends Thread implements Builder{<br> private ConcreteComputer computer;<br> public DirectorDemo(ConcreteComputer computer){<br> this.computer = computer;<br>}<br> public void construct(){<br> new OSBuilder(computer).buildOS("Windows7");<br> new CPUBuilder(computer).buildCPU("Intel i5");<br> new MemoryBuilder(computer).buildMemory(8);<br> }<br>}<br></code></pre><p>===============================================<br></p><pre><code class="language-java">public static void main(String[] args) throws Exception{<br> ConcreteComputer computer = new ConcreteComputer();<br> DirectorDemo director = new DirectorDemo(computer);<br> director.start();<br> Thread.sleep(1000); //让builder有时间去执行工作<br> System.out.println(computer);<br>}<br></code></pre><p>===============================================<br></p><span style="color: #A00000"><b>提示:</b></span><span style="color: #A00000"><b>由于线程调度的原因,上面的main函数并不是立即执行builder的工作,而是等待了1s后才开始执行builder的工作</b></span><span style="color: #A00000"><b></b></span><span style="color: #A00000"><b>因此输出的结果可能不是你所期望的</b></span><span style="color: #A00000"><b></b></span><span style="color: #A00000"><b>如果你想看到预期的效果,请注释掉main函数中的Thread.sleep语句</b></span><span style="color: #A00000"><b></b></span><span style="color: #A00000"><b></b></span><span style="color: #A00000"><b></b></span><span style="color: #A00000"><b></b></span><span style="color: #A00000"><b></b></span><span style="color: #A00000"><b></b></span><span style="color: #A00000"><b></b></span><span style="color: #A00000"><b></b></span><div class="highlighter-rouge"><div class="highlight pre-tag" role="button" title="Java代码块,已添加格式化标签!"><pre class="highlight pre-tag code-highlight language-java"><code>public static void main(String[] args) throws Exception{<br> ConcreteComputer computer = new ConcreteComputer();<br> DirectorDemo director = new DirectorDemo(computer);<br> director.start();<br> Thread.sleep(1000); //让builder有时间去执行工作<br> System.out.println(computer);<br>}</code></pre></div></div><p>===============================================</p><p>以上就是对建造者模式的一个简单示例,虽然这个例子很简单,但它展示了建造者模式的核心思想和优势——将复杂的构建过程与表示它的对象分离开来,使得代码更加清晰易懂、易于维护和扩展。