您的位置:首页 > 编程语言 > Java开发

七、创建型模式——建造模式

2018-04-03 18:26 169 查看
一、建造者模式介绍目的:建造模式适用于为客户端一点一点地建造新的对象1.建造者模式定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.建造模式的产生意义     一个产品常有不同的组成成分作为产品的零件,这些零件可能是对象,也有可能不是对象,它们通常称为产品的内部表象(比如一个电子邮件对象有发件人地址、收件人地址、主题、内容等)。不同的产品可以有不同的内部表象也就是不同零件,使用建造模式可以使客户端不需要知道所生成的产品对象有哪些零件,每个产品的零件有什么不同,是怎么建造出来的。
3..建造者模式包括的角色(1)Builder:给出一个抽象接口或抽象类,以规范产品的建造。这个接口规定要实现复杂对象的哪些部分的创建(一般来说产品有多少个零件就有多少个建造方法),并不涉及具体的对象部件的创建,一般由子类具体实现。(2)ConcreteBuilder:Builder接口的实现类,并返回组建好对象实例。(3)Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。(4)Product:要创建的复杂对象,产品类。导演者角色是与客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再讲这些请求为派给具体建造者角色。具体建造者做建造工作,但是却不为客户端所知。一个产品对应一个建造者,产品中的多个零件对应多个建造方法 4.建造者模式的使用场景:(1)当产品有复杂的内部构造时(参数很多)。(2)需要生产的产品的属性相互依赖,这些属性的赋值顺序比较重要时(因为在调用ConcreteBuilder的赋值方法时是有先后顺序的)。

二、案例演示 产品类要组装一台电脑(Computer类),我们假设它有三个部件:CPU 、主板以及内存。
public class Computer {
private String mCpu;
private String mMainboard;
private String mRam;

public void setmCpu(String mCpu) {
this.mCpu = mCpu;
}

public void setmMainboard(String mMainboard) {
this.mMainboard = mMainboard;
}

public void setmRam(String mRam) {
this.mRam = mRam;
}
}
Builder类
public abstract class Builder {
public abstract void buildCpu(String cpu);
public abstract void buildMainboard(String mainboard);
public abstract void buildRam(String ram);
public abstract Computer create();
}

Builder实现类创建Computer实例,完成组装后返回
public class MyComputerBuilder extends Builder {
private Computer mComputer = new Computer();
@Override
public void buildCpu(String cpu) {
mComputer.setmCpu(cpu);
}

@Override
public void buildMainboard(String mainboard) {
mComputer.setmMainboard(mainboard);
}

@Override
public void buildRam(String ram) {
mComputer.setmRam(ram);
}

@Override
public Computer create() {
return mComputer;
}
}

Director类导演类(Director)类用来规范组装电脑的流程顺序,先安装主板,再安装CPU,最后安装内存并组装成电脑。
public class Direcror {
Builder mBuild=null;
public Direcror(Builder build){
this.mBuild=build;
}
public Computer CreateComputer(String cpu,String mainboard,String ram){
//规范建造流程,这个顺序是由它定的
this.mBuild.buildMainboard(mainboard);
this.mBuild.buildCpu(cpu);
this.mBuild.buildRam(ram);
return mBuild.create();
}
}
客户端调用
Builder mBuilder = new MyComputerBuilder();
Direcror mDirecror=new Direcror(mBuilder);
mDirecror.CreateComputer("i7","Intel主板","mRam");


三、建造模式的精简1.省略抽象建造者角色    如何十分确定一个建造者就可以解决问题就可以省略2.在现实开发中,往往省去Director的角色,而直接使用一个Buider实例来进行对象的组装。这是建造者角色扮演了导演者和建造者的双重角色。3.进一步进行退化就可以合并产品和建造者,此时产品完成了三角色合一。(JavaMail的Message类、MimeMessage类)MimeMessage
//由邮件会话对象新建一个邮件消息对象
MimeMessage message=new MimeMessage(session);
//设置邮件地址
InternetAddress from=new InternetAddress("sunny@test.com");
message.setFrom(from);////建造发件人零件
InternetAddress to=new InternetAddress(to_mail);
message.setRecipient(Message.RecipientType.TO,to);//建造收件人零件
message.setSubject(to_title);//建造主题零件
message.setText(to_content);//建造信件内容零件
message.setSentDate(new Date());//建造发信时间零件
message.saveChanges();//存储邮件信息
Transport transport=session.getTransport("smtp");
transport.connect("smtp.test.com","test","test");
transport.sendMessage(message,message.getAllRecipients());
四、建造模式使用场景1.建造者模式优缺点建造者模式的优点:(1)建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心,良好的封装性是建造者模式的优点之一。(2)建造者类逻辑独立,易拓展。 建造者模式的缺点:很明显产生了多余的Build对象以及Dirextor对象,消耗了内存。
2.在以下情况下可以使用建造者模式需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

五、建造模式与其它模式的关系1.与抽象工厂模式在抽象工厂模式中,每一次工厂对象被调用时都会返还一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更庞大更复杂的产品,也有可能不会。建造类则是一定会建造出一个梗庞大梗复杂的产品。所以我们可以理解建造模式就是将抽象工厂模式组装产品成为更复杂产品的客户端抽离出来,作为导演。所以我们可以将建造角色交给抽奖工厂模式,两模式合一,完成更精致的建造女娲用建造模式负责把灵魂、耳目、手臂等组合成一个完整的人,而黄帝,炎黄各自利用工厂模式创造出灵魂、耳目、手臂等。女娲不用考虑灵魂、耳目、手臂的创造。
2.建造模式和策略模式建造模式是策略模式的一种特殊情况。建造模式适用于为客户端一点一点地建造新的对象,而不同类型的具体建造者角色虽然都拥有相同的接口,但是他们所创建出来的对象则可能完全不同。策略模式目的是为算法提供抽象接口。一个具体策略类把一个算法包装到一个对象里面,而不同的具体策略对象为一种一般性服务提供不同的实现
3.建造模式与模板方式建造模式完成最终退化就变成了模板方式
4.建造模式与合成模式当形成复杂产品,复杂产品内有子对象就变成了符合对象,这种对象中有对象的结构可以使用合成模式描述。合成模式描述一个对象树的组成结构,而建造模式则可以用来描述对象树的生成过程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息