首页 > 其他 > 详细

生成器模式小试

时间:2014-03-28 13:35:22      阅读:542      评论:0      收藏:0      [点我收藏+]

(前言:最近在复习设计模式,之前学的不少都忘了,而且印象不深刻,所以最近才每天抽时间复习。照着书本多打打代码,自己理解了之后按照自己的想法也打打代码,感觉进步挺大的。写这个博客,也是觉得自己好不容易打的东西,放在这里也好让日后自己可以轻松的复习。)

生成器模式是什么呢?

《研磨设计模式中》给了这样的定义:将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表示

生成器模式的本质——分离整体构建算法和部件构造

其实,生成器模式的目的,便是为了构建复杂的产品,将构建算法和构造实现分离出来,以便系统可以更好的优化、扩展。

理解生成器模式主要是理解生成器2个部件,一个是生成器(Builder),一个是指导者(Director)。生成器指的是整个复杂对象的构建过程、构建算法。而指导者指的是对生成器所生成的部件对象的构造和装配。

下面我们用一个例子来解释生成器模式。

1、问题:假设我们要生产水果罐头,大体上有这么3个环节——材料准备、加工、包装。这3个环节都很复杂,需要复杂的设计和管理技术。我们希望能尽可能的将这3个环节的构建和这3个环节的组合从复杂的类层次中独立出来,以便系统升级、优化!生成器模式可以很好的解决这个问题。

首先,3个环节可以抽象成这样3个简单的类,如下:

bubuko.com,布布扣
//预处理
public class Pretreatment {

    //这里只列出一个成员变量,实际还会有很多
    private Fruit fruit;

    public void setFruit(Fruit fruit) {
        this.fruit = fruit;
    }
    
    public Fruit getFruit() {
        return fruit;
    }
}
bubuko.com,布布扣
bubuko.com,布布扣
//制作过程
public class Proceed {
    // 这里只列出一个成员变量,实际还会有很多
    private Cook cook;

    public Cook getCook() {
        return cook;
    }

    public void setCook(Cook cook) {
        this.cook = cook;
    }

}
bubuko.com,布布扣
bubuko.com,布布扣
//包装
public class Pack {

    // 这里只列出一个成员变量,实际还会有很多
    private Can can;

    public Can getCan() {
        return can;
    }

    public void setCan(Can can) {
        this.can = can;
    }
}
bubuko.com,布布扣

2、为了构建整个过程,需要一个生成器,为了方便扩展,所以实现成接口,如下:

bubuko.com,布布扣
package builder.toBuild;

//生成器接口
public interface Builder {
    
    //把前面3个类作为形参传进来
    public void pretreatment(Pretreatment pre);

    public void proceed(Proceed pro);

    public void pack(Pack pack);
}
bubuko.com,布布扣

3、生成器接口的实现类,就是我们抽象出来的整个过程、构建逻辑的核心了。如下:

bubuko.com,布布扣
//生成器的实现类,封装了复杂对象的具体生成逻辑。
public class BuilderImpl1 implements Builder {

    public void pretreatment(Pretreatment pre) {
        System.out.println("现在是预处理部!");
        System.out.println("精心选用上等"+pre.getFruit().getName()+",剥皮,洗干净!");
    }

    public void proceed(Proceed proceed) {
        System.out.println("现在是加工部!");
        System.out.println("加工过程中,我们采用\""+proceed.getCook().getCookName()+"\"的先进工艺");
    }

    public void pack(Pack pack) {
        System.out.println("现在是在包装部");
        System.out.println("我们采用了"+pack.getCan().getName()+"进行了精心包装!");
    }
}
bubuko.com,布布扣

4、但是我们还需要一个指导者,为生成器注入原材料,并将生成器生成的对象进行拼接组装,为了方便扩展,当然也是先处理为一个接口,如下:

bubuko.com,布布扣
//指导者接口
public interface Director {
    //注入生成器对象
    public void setBuilder(Builder builder);
    //指导者进行将生成器生成的部分进行拼接
    public void proceed(Pretreatment pre,Proceed proceed,Pack pack);
}
bubuko.com,布布扣

5、指导者实现类如下:

bubuko.com,布布扣
public class DirectorImpl1 implements Director{

    private Builder builder;
    //注入生成器对象
    public void setBuilder(Builder builder) {
        // TODO Auto-generated method stub
        this.builder = builder;
    }

    //将生成器部件按简单的顺序进行组装
    public void proceed(Pretreatment pre,Proceed proceed,Pack pack){
        System.out.println("开始!");
        builder.pretreatment(pre);
        builder.proceed(proceed);
        builder.pack(pack);
        System.out.println("结束!");
    }    
}
bubuko.com,布布扣

6、客户端实现如下:

bubuko.com,布布扣
public class Client {

    public static void main(String[] args) {
        // 构建生成器
        Builder builder = new BuilderImpl1();
        // 通过生成器构建组织者
        DirectorImpl1 director = new DirectorImpl1();
        director.setBuilder(builder);

        // 简单组件
        Pretreatment pretreatment = new Pretreatment();
        pretreatment.setFruit(new Apple("红富士"));
        // 简单组件
        Proceed proceed = new Proceed();
        proceed.setCook(new Boil());
        // 简单组件
        Pack pack = new Pack();
        Can can = new Can();
        can.setName("铁制罐头");
        pack.setCan(can);
        // 组织者将简单组件注入到生成器中进行真正的组装,并将返回结果拼装。
        director.proceed(pretreatment, proceed, pack);
    }
}
bubuko.com,布布扣

最后结果:

bubuko.com,布布扣
开始!
现在是预处理部!
精心选用上等红富士,剥皮,洗干净!
现在是加工部!
加工过程中,我们采用"祖传黑火焖煮"的先进工艺
现在是在包装部
我们采用了铁制罐头进行了精心包装!
结束!
bubuko.com,布布扣

为了避免繁琐,演示中许多简单的JavaBean被省略了,为了看的方便,类的包名、import等都被我删去了。

生成器模式小试,布布扣,bubuko.com

生成器模式小试

原文:http://www.cnblogs.com/zrtqsk/p/3629066.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!