使用简单的对象一步一步构建成一个复杂的对象。
概念:
- 定义:讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 主要作用:在用户不知道 对象的建造过程和细节 的情况下就可以直接创建复杂的对象
- 如何使用:用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建负责对象(把内部的建造过程和细节隐藏起来)
- 解决的问题:①方便用户创建负责的对象(不需要知道实现过程)
②代码复用性\封装性(将对象那个构建过程和细节进行封装和复用)
注意事项:与工厂模式的区别是:建造者模式更加关注零件的装配顺序,一般用来创建更为复杂的对象。
角色分析:
①指挥者(Director)直接和用户(Client)进行需求沟通;
②沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
③将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
④各个具体建造者负责进行产品部件的构建;
⑤最终构建成具体产品(Product)
实现方式:
方式一:
通过Client,Director,Builder,Produce形成的建造者模式
角色分析:
- 抽象建造者(builder):描述具体建造者的公共接口,一般用来建造细节的方法,并不涉及具体的对象部件的方法。
- 具体建造者(ConcereteBuilder):描述具体建造者,并实现抽象建造者公共接口。
- 指挥者(Director):调用具体建造者来创建复杂对象(产品)的各个部分,并按照一定顺序(流程)来建造复杂对象。
- 产品(Product):描述一个由一些列组件组成较为复杂的对象。
方式二:
通过静态内部类方式实现零件无序装配化构造,该方式使用起来更加灵活,使用时可以根据用户的需求自定义更改内容,并且无需改变具体的构造方式,可以生产出不同的产品。
角色分析:
- 抽象建造者
- 具体建造者
- 产品
比第一种方式少了指挥者,主要是因为第二种方式把指挥者交给用户来操作,使得产品的创建更加灵活。
总结:
优点:
- 产品的建造与表示分离,实现了解耦,使用建造者模式可以使客户端不必知道产品内部的组成细节。
- 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
- 具体的建造者类之间是相互独立的,这有利于系统的扩展。也就是说,增加新的具体建造者无需修改原有类库的代码,符合开闭原则。
- 具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。
缺点:
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似:
如果产品之间的差异性很大,则不适合使用建造者模式,因此其适用范围受到一定的限制。 - 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
应用场景:
- 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性。
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
- 需要生成的对象内部属性本身相互依赖。
- 适合于一个具有较多的零件(属性)的产品(对象)的创建过程。
建造者与抽象工厂模式的比较:
- 与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂返回一系列相关的产品,这些产品位与不用的产品的等级结构,构成了一个产品族。
- 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥类来指导如何声称对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。
- 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一个完整的汽车。