设计模式之建造者模式
2015-12-15 15:19
211 查看
建造者模式:
是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式有以下几个角色:
1、Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造,这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2、ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建,在建造过程完成后,提供产品的实例。
3、Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不设计具体产品的信息,只负责保证对象各个部分完整创建或者按某种顺序来创建。
4、Product:要创建的复杂对象。
适用场景:
1、需要生成的产品对象有着复杂的内部结构,每一个内部成分本身可以是对象,也可以仅仅是一个对象(即产品对象)的一个组成成分
2、需要生成的的产品对象的属性相互依赖,建造者模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造者模式思想是很好的选择。
3、在对象的创建过程中会使用到系统中的其他一些对象这些对象在产品对象的创建过程中不易得到。
使用建造者模式有以下效果:
1、建造者模式的使用使得产品的内部表象可以独立变化,使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、每一个Builder都是相对独立,而与其他的Builder无关
3、模式所建的最终产品容易控制。
下面使用造人的小例子来实现下这个建造者模式:
Builder:(抽象建造者)
package com.desgin_builder.cn;
/**
* 角色Builder,里面必须有零件的创建方法,和产品实例得返回方法
* @author Joker
*
*/
public interface PersonBuilder {
//有多少个零件就有多少个建造的方法
public void buildHead();
public void buildBody();
public void buildFoot();
//返回产品实例的方法
public Person buildPerson();
}
抽象建造者的实现具体建造类:
package com.desgin_builder.cn;
/**
* ConcreteBuilder角色:实现抽象Builder接口完成具体的建造
* @author Joker
*
*/
public class ConcreteBuilder implements PersonBuilder {
private Person person;
public ConcreteBuilder(){
person = new Person();
}
@Override
public void buildHead() {
person.setHead("头");
}
@Override
public void buildBody() {
person.setBody("身体");
}
@Override
public void buildFoot() {
person.setFoot("脚");
}
@Override
public Person buildPerson() {
return person;
}
}
导演角色:
package com.desgin_builder.cn;
/**
* Director角色:指导具体建造者建造零件组装成产品
* @author Joker
*
*/
public class PersonDirector {
public Person constructPerson(PersonBuilder pb) {
pb.buildHead();
pb.buildBody();
pb.buildFoot();
return pb.buildPerson();
}
}
产品角色:
package com.desgin_builder.cn;
/**
* product角色,里面定义了包含那些零件
* @author Joker
*
*/
public class Person {
//目前定义的三零件,头 、身体、脚
private String head;
private String body;
private String foot;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
}
测试类:
package com.desgin_builder.cn;
public class Test {
public static void main(String[] args) {
//指导者
PersonDirector pd = new PersonDirector();
//一个具体的产品实例出来了,一个人
Person person = pd.constructPerson(new ConcreteBuilder());
//这个人有哪些部位
System.out.println(person.getHead());
System.out.println(person.getBody());
System.out.println(person.getFoot());
}
}
运行结果:
是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式有以下几个角色:
1、Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造,这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2、ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建,在建造过程完成后,提供产品的实例。
3、Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不设计具体产品的信息,只负责保证对象各个部分完整创建或者按某种顺序来创建。
4、Product:要创建的复杂对象。
适用场景:
1、需要生成的产品对象有着复杂的内部结构,每一个内部成分本身可以是对象,也可以仅仅是一个对象(即产品对象)的一个组成成分
2、需要生成的的产品对象的属性相互依赖,建造者模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造者模式思想是很好的选择。
3、在对象的创建过程中会使用到系统中的其他一些对象这些对象在产品对象的创建过程中不易得到。
使用建造者模式有以下效果:
1、建造者模式的使用使得产品的内部表象可以独立变化,使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、每一个Builder都是相对独立,而与其他的Builder无关
3、模式所建的最终产品容易控制。
下面使用造人的小例子来实现下这个建造者模式:
Builder:(抽象建造者)
package com.desgin_builder.cn;
/**
* 角色Builder,里面必须有零件的创建方法,和产品实例得返回方法
* @author Joker
*
*/
public interface PersonBuilder {
//有多少个零件就有多少个建造的方法
public void buildHead();
public void buildBody();
public void buildFoot();
//返回产品实例的方法
public Person buildPerson();
}
抽象建造者的实现具体建造类:
package com.desgin_builder.cn;
/**
* ConcreteBuilder角色:实现抽象Builder接口完成具体的建造
* @author Joker
*
*/
public class ConcreteBuilder implements PersonBuilder {
private Person person;
public ConcreteBuilder(){
person = new Person();
}
@Override
public void buildHead() {
person.setHead("头");
}
@Override
public void buildBody() {
person.setBody("身体");
}
@Override
public void buildFoot() {
person.setFoot("脚");
}
@Override
public Person buildPerson() {
return person;
}
}
导演角色:
package com.desgin_builder.cn;
/**
* Director角色:指导具体建造者建造零件组装成产品
* @author Joker
*
*/
public class PersonDirector {
public Person constructPerson(PersonBuilder pb) {
pb.buildHead();
pb.buildBody();
pb.buildFoot();
return pb.buildPerson();
}
}
产品角色:
package com.desgin_builder.cn;
/**
* product角色,里面定义了包含那些零件
* @author Joker
*
*/
public class Person {
//目前定义的三零件,头 、身体、脚
private String head;
private String body;
private String foot;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
}
测试类:
package com.desgin_builder.cn;
public class Test {
public static void main(String[] args) {
//指导者
PersonDirector pd = new PersonDirector();
//一个具体的产品实例出来了,一个人
Person person = pd.constructPerson(new ConcreteBuilder());
//这个人有哪些部位
System.out.println(person.getHead());
System.out.println(person.getBody());
System.out.println(person.getFoot());
}
}
运行结果:
相关文章推荐
- MySQL 定时器EVENT学习
- iOS开发表格操作
- OC-047.NSDictionary字典
- ThinkPHP十三禁止翻墙访问
- Spring常用注解
- Spring常用注解
- Spring常用注解
- OpenGL纹理贴图相关基本概念
- 架构之路(二):性能
- Spring常用注解
- Android PopupWindow的使用
- String和StringBuffer的转换
- 3-1、Intellij IDEA搭建配置Scala环境、打包
- Cannot create a server using the selected type
- IOS越狱插件之Flex 2 补丁
- WinDbg调试器:启动程序时自动连接调试器方法
- python引用与上级目录同目录文件夹下的文件方法
- $.merge的用法
- 摩申网络:浅析网络棋牌游戏用户群体
- 【工具设置】解决“请求筛选模块被配置为拒绝包含双重转义序列的请求”错误