设计模式之生成器模式(对象创建型模式)
1.定义/概念
将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示。
2.生成模式角色
Builder: 生成器接口,定义创建一个Product对象所需要的各个部件的操作。
ConcreteBuilder: 具体的生成器实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法。
Director: 指导者,也被称导向者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象。
Product: 产品,表示被生成器构建的复杂对象,包含多个部件。
3.应用场景:一水杯工厂要生产各式各样的水杯,无论杯子是神马造型,但都包括绳子,帽子和杯体。以此模型创建各种类型的杯子。
Builder.java
package com.glut.demo6;
/**
* Builder类
* 生成器接口,定义创建一个Product对象所需要的各个部件的操作。
* @author qichunlin
*
*/
public abstract class Builder {
//创建一个杯子 原来这里是设为protected类型的
Cup cup = new Cup();
//建立杯子模型
public abstract void buildString();//创建一个绳子部件
public abstract void buildCap();//创建一个帽子部件
public abstract void buildCupBody();//创建一个杯体部件
//返回一个杯子对象
public Cup getResult() {
return cup;
}
}
ClassCup.java
package com.glut.demo6;
/**
*
* 具体建造者 ConcreteBuilder
* @author qichunlin
*
*/
public class ClassCup extends Builder{
@Override
public void buildString() {
cup.setString("生产绳子");
System.out.println("生产绳子....");
}
@Override
public void buildCap() {
cup.setCap("生产帽子");
System.out.println("生产帽子....");
}
@Override
public void buildCupBody() {
cup.setCupbody("生产杯体");
System.out.println("生产杯体....");
}
}
Cup.java
package com.glut.demo6;
/**
* 杯子类
*
* @author qichunlin
*
*/
public class Cup {
private String string;//绳子
private String cap;//帽子
private String cupbody;//杯体
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public String getCap() {
return cap;
}
public void setCap(String cap) {
this.cap = cap;
}
public String getCupbody() {
return cupbody;
}
public void setCupbody(String cupbody) {
this.cupbody = cupbody;
}
//显示
public void show() {
System.out.println("杯子生产完毕!");
}
}
Director.java
package com.glut.demo6;
/**
* 导演类
*
* @author qichunlin
*
*/
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
//获取产品
public void create() {
builder.buildString();
builder.buildCap();
builder.buildCupBody();
builder.getResult().show();
}
}
Test.java
package com.glut.demo6;
/**
* 生成器模式
*
* 定义:将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示。
* @author qichunlin
*
*/
public class Test {
public static void main(String[] args) {
//创建具体建造者
ClassCup cc = new ClassCup();
//创建指挥者
Director d = new Director(cc);
d.create();
}
}
4.生成器模式与工厂模式的不同
生成器模式构建对象的时候,对象通常构建的过程中需要多个步骤,就像我们例子中的先有主机,再有显示屏,再有鼠标等等,生成器模式的作用就是将这些复杂的构建过程封装起来。
工厂模式构建对象的时候通常就只有一个步骤,调用一个工厂方法就可以生成一个对象。
5.生成器模式的优缺点
优点
将一个对象分解为各个组件
将对象组件的构造封装起来
可以控制整个对象的生成过程
缺点
对不同类型的对象需要实现不同的具体构造器的类,这可能回答大大增加类的数量
6.生成器模式的功能
生成器模式的主要功能是构建复杂的产品,而且是细化的,分步骤的构建产品,也就是生成器模式重在一步一步解决构造复杂对象的问题。如果仅仅这么认知生成器模式的功能是不够的。
更为重要的是,这个构建的过程是统一的、固定不变的,变化的部分放到生成器部分了,只要配置不同的生成器,那么同样的构建过程,就能构建出不同的产品来。