胖虎白话学习设计模式之建造者设计模式(Builder)/生成器设计模式
记录胖虎学习设计模式过程,不许勿喷,转载请注明出处!
http://blog.csdn.net/ljphhj
1.存在问题
开发中我们经常会遇到一种情况,有时候我们要构建一个对象的时候,没办法一下子得到对象的所有需要的信息,特别是那种有的时候目标对象的构造函数的参数
只能一步步获取到的时候,这时候我们希望一步步地构造出目标对象。
其实说得通俗点,就是我们想把目标对象的“构建”和“表现”分离开来,让客户只要通过指定参数就可以构建它们,而不知道内部的具体构建过程
(我同学有个人喜欢玩“高达机器人”的【ps:太贵,我等屌丝玩不起】,但买过来之后是一大堆的零部件,大概有上百个吧,要将这些部件装配成一个高达机器人,这个装配过程可能非常复杂
,可能需要很多得技术水平处理,所以我们将“表现”【部件】和“构建”【组装】分开的话,就不用去关心他是如何组装的过程了)
那么引入解决方法:建造者设计模式
(将构建过程和部件表现分离开,这实际上是一个实现解耦的设计模式)
2.建造者设计模式(Builder)
建造者设计模式主要用于:把构造对象实例的逻辑代码移到要实例化类的外部(如:类A要实例化对象,类A中实例化的一些操作放在类B中来完成)
在建造者模式中的各个角色有:
(1)组装指导者(Director)角色:主要是用于“指导”这个产品类对象的组装过程
(2)产品类(Product):表示被构造的复杂的类
(3)抽象建造者(AbstractBuilder【Builder】)角色:提供一些构建产品类需要的部件的构建接口
(4)具体建造者(ConcreteBuilder)角色:用于体现零部件的构建过程
UML图讲述建造者设计模式要点:
图1:

抽象建造者(AbstractBuilder【Builder】,通常定义为接口或者抽象类):
具体建造者(ConcreteBuilder):
组装指导者(Director):
主函数调用构建过程:
当然如果只看到这里的话,你只是了解了基本的“建造者模式”的用法,而不知道它真正的有扩展性的用法是如下:
“建造者模式”中“具体建造者”的类只要组成部分相同,便可以适用,这样子可以兼容所有类似的Product(这里是:person)
图2( 来自于网络)
3.建造者设计模式小结
Builder模式主要是将一个复杂类对象的构造过程涉及到的逻辑代码从该类中分离出来,直接简化了原来复杂的类
建造者类几种负责目标类对象部件的构造,而目标类则集中完成有效实例的各种非构造操作(get,set),另外Builder模式
还让我们可以一步步地来构造一个对象而不需要一次性构造.
建造者设计模式看起来简单,实则内含的思想还是比较复杂的,现在只懂皮毛还不能很好的领悟,如果有网友有好的想法,给我留言哈!
记录胖虎学习设计模式过程,不许勿喷,转载请注明出处!
http://blog.csdn.net/ljphhj
1.存在问题
开发中我们经常会遇到一种情况,有时候我们要构建一个对象的时候,没办法一下子得到对象的所有需要的信息,特别是那种有的时候目标对象的构造函数的参数
只能一步步获取到的时候,这时候我们希望一步步地构造出目标对象。
其实说得通俗点,就是我们想把目标对象的“构建”和“表现”分离开来,让客户只要通过指定参数就可以构建它们,而不知道内部的具体构建过程
(我同学有个人喜欢玩“高达机器人”的【ps:太贵,我等屌丝玩不起】,但买过来之后是一大堆的零部件,大概有上百个吧,要将这些部件装配成一个高达机器人,这个装配过程可能非常复杂
,可能需要很多得技术水平处理,所以我们将“表现”【部件】和“构建”【组装】分开的话,就不用去关心他是如何组装的过程了)
那么引入解决方法:建造者设计模式
(将构建过程和部件表现分离开,这实际上是一个实现解耦的设计模式)
2.建造者设计模式(Builder)
建造者设计模式主要用于:把构造对象实例的逻辑代码移到要实例化类的外部(如:类A要实例化对象,类A中实例化的一些操作放在类B中来完成)
在建造者模式中的各个角色有:
(1)组装指导者(Director)角色:主要是用于“指导”这个产品类对象的组装过程
(2)产品类(Product):表示被构造的复杂的类
(3)抽象建造者(AbstractBuilder【Builder】)角色:提供一些构建产品类需要的部件的构建接口
(4)具体建造者(ConcreteBuilder)角色:用于体现零部件的构建过程
UML图讲述建造者设计模式要点:
图1:
Demo实例:
package cn.xym.test;
public class GoudaRobot {
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;
}
@Override
public String toString() {
return "GoudaRobot [head=" + head + ", body=" + body + ", foot=" + foot
+ "]";
}
}
抽象建造者(AbstractBuilder【Builder】,通常定义为接口或者抽象类):
package cn.xym.test;
public interface AbstractBuilder {
void buildFoot();
void buildHead();
void buildBody();
GoudaRobot getProduct();
}
具体建造者(ConcreteBuilder):
package cn.xym.test;
public class ConcreteBuilder implements AbstractBuilder{
private GoudaRobot robot = new GoudaRobot();
@Override
public void buildFoot() {
System.out.println("创建出高达机器人的脚部件的操作");
robot.setFoot("foot");
}
@Override
public void buildHead() {
System.out.println("创建出高达机器人的头部件的操作");
robot.setHead("head");
}
@Override
public void buildBody() {
System.out.println("创建出高达机器人的身体部件的操作");
robot.setBody("body");
}
@Override
public GoudaRobot getProduct() {
return robot;
}
}
组装指导者(Director):
package cn.xym.test;
public class Director {
private AbstractBuilder builder;
public Director(AbstractBuilder builder) {
this.builder = builder;
}
public void ConstructProduct(){
//构造产品类的过程,也可以在这个方法类对一些构建的要求做限定,比如
//希望构建出来的头的重量不能大于多少kg呀.
//先构建头,再构建身体,最后构建脚
builder.buildHead();
builder.buildBody();
builder.buildFoot();
}
}
主函数调用构建过程:
package cn.xym.test;
public class Main {
public static void main(String[] args) {
AbstractBuilder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.ConstructProduct();
GoudaRobot robot = builder.getProduct();
System.out.println(robot);
}
}
当然如果只看到这里的话,你只是了解了基本的“建造者模式”的用法,而不知道它真正的有扩展性的用法是如下:
“建造者模式”中“具体建造者”的类只要组成部分相同,便可以适用,这样子可以兼容所有类似的Product(这里是:person)
图2( 来自于网络)
3.建造者设计模式小结
Builder模式主要是将一个复杂类对象的构造过程涉及到的逻辑代码从该类中分离出来,直接简化了原来复杂的类
建造者类几种负责目标类对象部件的构造,而目标类则集中完成有效实例的各种非构造操作(get,set),另外Builder模式
还让我们可以一步步地来构造一个对象而不需要一次性构造.
建造者设计模式看起来简单,实则内含的思想还是比较复杂的,现在只懂皮毛还不能很好的领悟,如果有网友有好的想法,给我留言哈!