【建造者模式】
又称为生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式中,主要有4个角色:
1.Product产品类(例子中的Computer类)
表示被构建的复杂对象(通常是实现了模板方法模式)。
2.Builder抽象建造者类(例子中的Builder接口)
规范产品的组装,一般由子类来实现。
3.ConcreteBuilder具体建造者类(例子中的AsusComputerBuilder类)
实现抽象建造者类的类,实现抽象建造者类(或接口)中的所有方法,并且返回一个组建好的对象(例子中的getProduct()方法)。
4.Director导演类(例子中的Director类)
构造一个使用Builder抽象类(或接口)的对象,返回一个创建好的产品。
【建造者模式 例子】
package com.Higgin.Builder; /** * PC产品 */ class Computer{ private String mouse; //鼠标 private String keyBoard; //键盘 private String master; //主机 private String monitor; //显示器 public String getMouse() { return mouse; } public void setMouse(String mouse) { this.mouse = mouse; } public String getKeyBoard() { return keyBoard; } public void setKeyBoard(String keyBoard) { this.keyBoard = keyBoard; } public String getMaster() { return master; } public void setMaster(String master) { this.master = master; } public String getMonitor() { return monitor; } public void setMonitor(String monitor) { this.monitor = monitor; } @Override public String toString() { return "Computer [mouse=" + mouse + ", keyBoard=" + keyBoard + ", master=" + master + ", monitor=" + monitor + "]"; } } /** * 建造者 接口/抽象类 */ interface Builder{ public void buildMouse(); public void buildKeyBoard(); public void buildMaster(); public void buildMonitror(); public Computer getProduct(); } /** * 具体建造者:华硕电脑建造者
* (这里是组装电脑,主要是主机是华硕的就算是华硕电脑建造者,另外还可以添加弘基电脑建造者、苹果电脑建造者等等) */ class AsusComputerBuilder implements Builder{ private Computer computer=new Computer(); @Override public void buildMouse() { this.computer.setMouse("罗技鼠标"); } @Override public void buildKeyBoard() { this.computer.setKeyBoard("Cherry机械键盘"); } @Override public void buildMaster() { this.computer.setMaster("华硕主机"); } @Override public void buildMonitror() { this.computer.setMonitor("AOC显示器"); } @Override public Computer getProduct() { return this.computer; } } /** * 导演类 */ class Director{ public Computer constructComputer(Builder cb){ cb.buildMouse(); cb.buildKeyBoard(); cb.buildMaster(); cb.buildMonitror(); return cb.getProduct(); } } /** * 客户端类 */ public class TestBuilder { public static void main(String[] args) { Director director=new Director(); //先实例化一个导演类 Builder builder=new AsusComputerBuilder(); //然后实例化一个 华硕电脑建造者 Computer computer=director.constructComputer(builder); //调用导演类的创建PC方法 System.out.println(computer.toString()); //打印结果 } }
【运行结果】
【建造者模式 优点】
* 封装性
使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们不需要关心每一个具体模型内部是如何实现的,产生的对象类型就是Computer。
* 建造者独立,容易扩展
本例中是华硕电脑建造者AsusComputerBuilder,后面我们还可以添加苹果电脑建造者、IBM电脑建造者,利于系统的扩展。
* 便于控制细节风险
由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
【使用场景】
* 相同的方法,不同的执行硕勋,产生不同的事件结果时,可以采用建造者模式。
* 多个部件或零件,都可以装配到一个对象中(如鼠标、键盘、主机、显示器转配成一台电脑),但是产生的运行结果又不用的时(使用不用的鼠标、键盘、主机...),可以使用该模式。
* 产品类较为复杂。