真正的装配厂模式(builder pattern)(3.2)

本文探讨了装配厂模式(建造者模式)的应用场景,解释了为何在建造者模式中产品通常不定义抽象类。内容指出,由于不同建造者创建的产品差异过大,不构成产品族,所以不需要在抽象建造者中包含返回产品的通用方法。同时,文章强调了Director类在模式中的关键作用,它是稳定性的保障,负责封装复杂对象的生成算法,可以与不同建造者配合以创建不同类型的对象。
摘要由CSDN通过智能技术生成

本系列的目标读者,是熟知设计模式,能够随手给出该模式的Java演示代码的程序员。

 

2.2.2装配厂模式 

 

为什么产品没有抽象类

装配厂模式(builder pattern)的适用场景也是构建复杂产品,它包含多个成员变量表示的对象。例如美女是个复杂对象,由年龄(范围)、职业/profession、身高/len和肤色/complexion等数据描述。

例程 2 12抽象Builder
package creational.builder;
public abstract class MMBuilder{
    public void setAge(int age){}//
    public void setProfession(String profession ){}//职业
    public void setSurface(String... s){};//外表
}

注意,比较伪建造者模式的例程2-9,抽象类如MMBuilder中没有定义返回产品的方法getResult()。原因是MMBuilder的两个子类分别是婚姻介绍所/MarriageBureau和画家/Painter,它们按照相同的生产流程construct()或build()以自己的方式/方法挑选或创建产品,婚姻介绍所挑选出真实的MM对象,而画家创建一个卡通或美女肖像/Portrait。

这就是[GoF·3.2.8]中回答“为什么产品没有抽象类”的原因。具体的build生产的产品差异太大,以至不构成产品族。抽象类MMBuilder并不知道最终的产品的类型,如果让它返回一个Object或某种标记接口没有意义。因而它不包含GetResult()这种工厂方法。

抽象类MMBuilder中的方法均为空方法,作用如同Java GUI中的适配器,参考[3.1]中介绍的伪适配器模式。

由于按照相同的生产流程construct()生产,因而MM和Portrait的成员变量基本相似。这些数据的构想,来自于范伟的一句台词:“二十八,白领,大个,白”。

建造者模式-2

建造者模式的主要意义在于保证Director类的稳定。Director封装复杂对象的生成算法,而“算法应该独立于该对象的组成部分以及它们的装配方式”。

package creational.builder;
/**
 * 
 * @author yqj2065
 * @version 0.1
 */
public class MMDirector{
    private MMBuilder builder;
    public MMDirector(MMBuilder builder){
        this.builder =builder;
    }
    public void build(int age1,int age2,String profession,String len,String complexion){
        builder.setAge(age1);
        builder.setAge(age2);
        builder.setProfession(profession);
        builder.setSurface(len,complexion);
    }
}


因此,可以为Director的算法配置不同的具体builder而生成不同的对象如MM对象或肖像/Portrait对象;也可以由多个复杂对象的生成算法如Director、Director2共享同一个builder以复用对象的装配方式。

在这种建造者模式的场景中,Client要依赖Director、各种具体builder以及各种产品。

package 建造者模式;

/**
 * Client.java.
 * 
 * @author yqj2065
 * @version 0.1
 */
public class Client{
    public static void test(){
        MarriageBureau builder = new MarriageBureau();
        MMDirector director = new MMDirector(builder);
        director.build(28,30,"白领","大个","白");
        MM mm =builder.getMM();
        mm.say();
        
        Painter b = new Painter();
        MMDirector d = new MMDirector(b);
        d.build(28,30,"白领","大个","白");
        Portrait mm2 =b.getPortrait();
        mm2.copy();
        mm2.copy();
        System.out.println(mm2.toString());
    }    
}


输出:
我是MM,28~ 30 白领 大个 白
我是相片0
我是相片1
28 白领 大个 白

 

从中你要充分注意Director类的作用。建造者模式(builder pattern)的主要意义在于保证Director类的稳定

而产品可以是标具体的建造者创建的美女对象或美女相片对象(非产品族)。装配方式由具体的建造者封装。

  


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值