设计模式(7)-建造模式(Build)

【更新】

2013-01-12,补充实例剖析。

【描述】建造模式定义了处理其他对象的复杂构建的对象设计。

【UML图】

图1

1 BuildClient类提供了setBuilder()方法,设置一个建造者;

2 Builder类提供了一组方法接口,BuildA()、BuildB()、BuildC();

3 BuildClient类提供了build()方法,调用Builder对象的一组方法。

 

【示例代码】

builder.h

#ifndef BUILDER_H
#define BUILDER_H

class Builder
{
public:
    Builder();

public:
    virtual void BuildA();
    virtual void BuildB();
    virtual void BuildC();

};

#endif // BUILDER_H


builder.cpp

#include <QDebug>
#include "builder.h"

Builder::Builder()
{
    qDebug()<<"construct Builder";
}

void Builder::BuildA()
{

}

void Builder::BuildB()
{

}

void Builder::BuildC()
{

}


xmlbuilder.h

#ifndef XMLBUILDER_H
#define XMLBUILDER_H

#include "builder.h"

class XMLBuilder : public Builder
{
public:
    XMLBuilder();

public:
    void BuildA();
    void BuildB();
    void BuildC();
};

#endif // XMLBUILDER_H


xmlbuilder.cpp

#include <QDebug>
#include "xmlbuilder.h"

XMLBuilder::XMLBuilder()
{
    qDebug()<<"construct XMLBuilder";
}

void XMLBuilder::BuildA()
{
    qDebug()<<"XMLBuilder BuildA";
}

void XMLBuilder::BuildB()
{
    qDebug()<<"XMLBuilder BuildB";
}

void XMLBuilder::BuildC()
{
    qDebug()<<"XMLBuilder BuildC";
}


textbuilder.h

#ifndef TEXTBUILDER_H
#define TEXTBUILDER_H

#include "builder.h"

class TextBuilder : public Builder
{
public:
    TextBuilder();

public:
    void BuildA();
    void BuildB();
    void BuildC();
};

#endif // TEXTBUILDER_H


textbuilder.cpp

#include <QDebug>
#include "textbuilder.h"

TextBuilder::TextBuilder()
{
     qDebug()<<"construct TextBuilder";
}

void TextBuilder::BuildA()
{
    qDebug()<<"TextBuilder BuildA";
}

void TextBuilder::BuildB()
{
    qDebug()<<"TextBuilder BuildB";
}

void TextBuilder::BuildC()
{
    qDebug()<<"TextBuilder BuildC";
}

 

buildclient.h

#ifndef BUILDCLIENT_H
#define BUILDCLIENT_H

#include "builder.h"

class BuildClient
{
public:
    BuildClient();

private:
    Builder *builder;

public:
    void setBuilder(Builder *builder);
    void build();
};

#endif // BUILDCLIENT_H


buildclient.cpp

#include <QDebug>
#include "buildclient.h"

BuildClient::BuildClient()
{
}

void BuildClient::setBuilder(Builder *builder)
{
    this->builder = builder;
}

void BuildClient::build()
{
    builder->BuildA();
    builder->BuildB();
    builder->BuildC();
}


main.cpp

#include <QDebug>
#include "buildclient.h"
#include "xmlbuilder.h"
#include "textbuilder.h"

int main(int argc, char **argv)
{
    BuildClient client;
    client.setBuilder(new XMLBuilder);
    client.build();
    return 0;
}


【运行结果】

construct Builder 
construct XMLBuilder 
XMLBuilder BuildA 
XMLBuilder BuildB 
XMLBuilder BuildC 

 

【对比】建造模式和策略模式

设计模式(3)-策略模式(Strategy)一文中,示例代码UML图,如图2所示:

图2

对比策略模式的UML图,不难发现策略模式与建造模式极为相似。他们之间有何区别呢?

区别:策略模式提供的是一个方法,而建造模式提供的是一组方法。

 

对于建造模式和策略模式的区别,有不同看法,欢迎提出宝贵意见,共同学习!

 

【实例剖析】

早一阵子在CSDN上传了几个加密算法的资源:

AES加解密算法

DES加解密算法

现在的问题是如何做到算法的灵活切换?一开始,我想到的方法利用策略模式,但进行的并不顺利。原因是:算法复杂度较高,步骤繁多,打包的接口难于统一。后来想到了建造模式。在上述两种算法的基础上,还引入了另一种算法。其UML图如图所示:

 

 

图3

 

现在的做法可概括如下:

1 界面类只负责接收参数;

2 通过WizardPage实现导航,导航完成,触发建造(Build);

3 以加密建造为例:

(1) 建立一个EncryBuild抽象接口;

(2) 实现了3个具象加密类;

(3) EncryWizardPage作为Client,负责选择Builder。

加解密软件实现效果如下:

图4

源码不方便公开,只介绍方法,见谅!

 

 

【源码下载】

Qt设计模式1-8测试源码:http://download.csdn.net/detail/tandesir/4984275
 声明:该源码仅供学习交流,勿用于商业目的。

 

转载请标明出处,仅供学习交流,勿用于商业目的

Copyright @ http://blog.csdn.net/tandesir

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java建造设计模式是一种创建对象的设计模式,它可以通过一步一步地构建复杂对象,使得对象的构建过程更加灵活和可控。在建造模式中,通过定义一个Builder类来设置和构建对象的属性,然后通过调用build方法实例化对象。 建造设计模式有以下几个优点: 1. 通过建造模式可以将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。 2. 可以通过链式调用的方式设置对象的属性,使得代码更加可读和易于维护。 3. 可以防止对象在实例化之前就被调用,从而避免了对象的不一致性。 4. 解决了JavaBean模式中线程安全问题。 下面是一个示例代码,展示了如何使用Java建造设计模式: ```java public class User { private String id; private String name; private String password; private String phone; private User(UserBuilder builder) { this.id = builder.id; this.name = builder.name; this.password = builder.password; this.phone = builder.phone; } public String getId() { return id; } public String getName() { return name; } public String getPassword() { return password; } public String getPhone() { return phone; } public static class UserBuilder { private String id; private String name; private String password; private String phone; public UserBuilder setId(String id) { this.id = id; return this; } public UserBuilder setName(String name) { this.name = name; return this; } public UserBuilder setPassword(String password) { this.password = password; return this; } public UserBuilder setPhone(String phone) { this.phone = phone; return this; } public User build() { return new User(this); } } } // 使用建造模式创建User对象 User user = new User.UserBuilder() .setId("001") .setName("John") .setPassword("123456") .setPhone("1234567890") .build(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值