`

创建型-建造者模式

 
阅读更多

建造者模式

定义

将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。

建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。它关注如何一步一步创建一个的复杂对象,不同的具体建造者定义了不同的创建过程(包括创建出的形态和创建组建的顺序),且具体建造者相互独立,增加新的建造者非常方便,无须修改已有代码,系统具有较好的扩展性。

角色

● 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  

 

 

  • 大小: 29.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics