建造者模式
定义
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。它关注如何一步一步创建一个的复杂对象,不同的具体建造者定义了不同的创建过程(包括创建出的形态和创建组建的顺序),且具体建造者相互独立,增加新的建造者非常方便,无须修改已有代码,系统具有较好的扩展性。
角色
● Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。
●ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
●Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
● Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。
实例与应用
1.比如一个人有不同的形态,但是都是人有头有身体
2.我觉得写的比较好的是那个游戏的角色的实例,使用建造者模式,不同的角色穿不同的衣服有不同的头像
// 一个典型的复杂类对象代码示例如下: class Productor { private Part partA; private Part partB; private Part partC; // 这些是各个部件的set和get的方法,在此省略。。。 } 这是抽象的Builder: abstract class Builder { public abstract void buildPartA(); public abstract void buildPartB(); public abstract void buildPartC(); } 继承Builder的具体的建造者: class ConcreteBuilder extends Builder { private Product product; // 创建partA public void buildPartA() { // 在此创建出部件 Part partA = new PartA(); // ...... // 把partA传递给product product.setPartA(partA); } // 创建partB public void buildPartB() { // 在此创建出部件 Part partB = new PartB(); // ...... // 把partB传递给product product.setPartB(partB); } // 创建partC public void buildPartC() { // 在此创建出部件 Part partC = new PartC(); // ...... // 把partC传递给product product.setPartC(partC); } // 返回复杂产品对象 public void getProduct() { return this.product; } } // 这是导演,负责流程规范,在导演类中可以注入建造者对象。 class Director { private Builder concretebuilder; // 构造方法中也可以传递builder public Director(Builder builder) { this.concretebuilder = builder; } // 传递builder public void setBuilder(Builder builder) { this.concretebuilder = builder; } // 这个方法用来规范流程,产品构建和组装方法 public void construct() { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } } // 客户端使用: class Main { public static void main(String[] args) { // 对于客户端而言,只需要关心具体的建造者,无需关心产品内部构建流程。我如果需要其他的复杂产品对象,只需要选择其他的建造者,如果需要扩展,则只需要写一个新的builder就行。如果可以,这个建造者甚至可以用配置文件做,增加更多的扩展性。 Builder builder = new ConcreteBuilder(); // 把建造者注入导演 Director director = new Director(builder); // 指挥者负责流程把控 director.construct(); // 建造者返回一个组合好的复杂产品对象 Productor productor = builder.getProductor(); } }
优点
1.使用建造者模式可以使客户端不必知道产品内部组成的细节。
2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。
3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
使用场景
1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时
与工厂模式比较
我们可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。
工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。
建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。
以上很多都是转载自:http://blog.csdn.net/hello_haozi/article/details/38819935