博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成器模式小试
阅读量:5807 次
发布时间:2019-06-18

本文共 3840 字,大约阅读时间需要 12 分钟。

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

一、介绍

生成器模式是什么呢?

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

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

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

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

 

二、结构

1、Product——需要最终构建的复杂对象。

2、Director——指导者。用来使用生成器接口,并定义一个整体的构建算法,定义产品构建中不变的那些部分,而其他部分交给Builder来实现。

3、Builder——生成器接口。定义创建一个Product所需的各个部件的操作。

4、ConcreteBuilder——具体的生成器实现。实现Product各个组件的创建,并且负责组装各个部件。同时还可以获得整个产品。

研磨设计模式里面有个很形象的图,这里拿来用一下:

 

三、我的实现

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

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

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

//预处理public class Pretreatment {    //这里只列出一个成员变量,实际还会有很多    private Fruit fruit;    public void setFruit(Fruit fruit) {        this.fruit = fruit;    }        public Fruit getFruit() {        return fruit;    }}
//制作过程public class Proceed {    // 这里只列出一个成员变量,实际还会有很多    private Cook cook;    public Cook getCook() {        return cook;    }    public void setCook(Cook cook) {        this.cook = cook;    }}
//包装public class Pack {    // 这里只列出一个成员变量,实际还会有很多    private Can can;    public Can getCan() {        return can;    }    public void setCan(Can can) {        this.can = can;    }}

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

package builder.toBuild;//生成器接口public interface Builder {        //把前面3个类作为形参传进来    public void pretreatment(Pretreatment pre);    public void proceed(Proceed pro);    public void pack(Pack pack);}

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

//生成器的实现类,封装了复杂对象的具体生成逻辑。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()+"进行了精心包装!");    }}

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

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

5、指导者实现类如下:

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("结束!");    }    }

6、客户端实现如下:

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);    }}

最后结果:

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

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

转载于:https://www.cnblogs.com/zrtqsk/p/3629066.html

你可能感兴趣的文章
NeurIPS 2018|如何用循环关系网络解决数独类关系推理任务?
查看>>
Windows 10 份额突破 40%,Windows 7 连跌四月终回升
查看>>
怎么把Maven项目转为动态Web项目?
查看>>
Arm发布Cortex-A76AE自动驾驶芯片架构,宣示车载系统市场主权
查看>>
FreeBSD ports中make可带有的参数(转)
查看>>
Hibernate入门教程
查看>>
Java支付宝扫码支付[新]
查看>>
SpringMVC 拦截器 筛选
查看>>
CronExpression介绍
查看>>
第十八章:MVVM(八)
查看>>
点击表头切换升降序排序方式
查看>>
第26天,Django之include本质
查看>>
Java中静态变量和实例变量的区别
查看>>
秋名山老司机(详解)——bugku
查看>>
RED | Robot Framework集成开发环境
查看>>
育碧同 Mozilla 联手开发 AI 代码助手
查看>>
【实用】面对枯燥的源码,如何才能看得下去?
查看>>
智库说 | 徐远:数字时代的城市潜力
查看>>
《JSP极简教程》jsp c:forEach用法
查看>>
WebSocket详解(六):刨根问底WebSocket与Socket的关系
查看>>