生成器模式
模式定义
生成器模式将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。在GOF95中该模式被分类为创建型模式。
模式结构与说明
- Builder:生成器接口,定义了创建一个Product对象所需各部件的操作(上图中的 build*() )
- ConcreteBuilder:具体生成器实现,实现各部件的创建,并负责组装Product的各部件,同时提供获取最终产品的一个方法 getResult()
- Director:指导者:调用Builder,按照一个统一的过程 construct() 来构建所需要的Product对象
- Product:产品,包含多个部件
生成器模式用来构建复杂对象,并且是细化的、分步骤的构建。更重要的是,对象的构建过程是统一的、固定不变的,生成器模式把这一不变的部分抽象出来由Director完成,而把容易变化的具体创建细节留给Builder实现。
生成器模式的优点:
- 实现了产品构建过程和产品表现的解耦
- 更容易的改变产品的内部表示
- 更好的复用,使得产品的构建算法得以重用
生成器模式的适用时机:
- 创建复杂对象的算法应当独立于对象的组成部分以及组成部分的装配方式时
- 一个构建过程具有多种不同的表示时
经典应用
java.lang.appendable
该接口的实现都是一种退化了的生成器模式:
Director的角色由Client来充当,Appendable则同时充当了Builder、Product角色。Appendable接口提供了多种构建“部分”的方法,Director通过多次调用这些方法,最终获得完整的Appendable。
Netty的Bootstrap
与Appendable类似,Netty的Bootstrap也使用了退化的生成器模式:
1 2 3 4 5 6 7 8 9 10 |
Bootstrap b = new Bootstrap(); b.group( group ) .channel( NioSocketChannel.class ) .remoteAddress( new InetSocketAddress( host, port ) ) .handler( new ChannelInitializer() { public void initChannel( SocketChannel ch ) throws Exception { ch.pipeline().addLast( new EchoClientHandler() ); } } ); |
模式演变
- 与工厂方法模式联用:buildPart*方法可以作为工厂方法实现,以创建具体部件
- 与模板方法的比较:两者都定义了“算法骨架”,模板方法将步骤延迟到子类中实现;生成器则通过组合将这些步骤委托给Builder实现
- 与组合模式联用:对于复杂的组合结构,可以利用生成器模式来一步步构建
Leave a Reply