建造者模式
建造者模式是一步一步创建一个复杂对象的创建型模式,它允许使用者在不知道内部建造细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,是的构建过程和不见得表示隔离开来。
二,建造者模式的定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
三,建造者模式的使用场景
(1)相同的方法,不同的执行顺序,产生不同的事件结果。
(2)对各部件或零件,都可以配到一个对象中,但是产生的运行结果又不相同时。
(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的结果,这个时候使用创建者模式非常合适。
(4)当初始化一个对象特别复杂,如参数多,且很多参数都有默认值时。
四,建造者模式的UML类图
实例1:设计小人的加工过程的程序
源代码:
方法一:用户在客户端实现加工,出错率高,且操作复杂,加工类型少
package org.yunan.design;
public class bulider1 {
public static void main(String[] args) {
bulidman man= new Man();//小人
man.buildtype();
man.buildHead();
man.buildLeftfoot();
man.buildLefthand();
man.buildRightfoot();
man.buildRighthand();
}
}
interface bulidman{
public abstract void buildtype();//类型
public abstract void buildHead();//头
public abstract void buildTorso();//躯干
public abstract void buildLeftfoot();//左脚;
public abstract void buildLefthand();//左手
public abstract void buildRightfoot();//右脚;
public abstract void buildRighthand();//右手;
}
class Man implements bulidman{
@Override
public void buildtype() {
// TODO Auto-generated method stub
System.out.println("小人");
}
@Override
public void buildHead() {
// TODO Auto-generated method stub
System.out.println("头");
}
@Override
public void buildTorso() {
// TODO Auto-generated method stub
System.out.println("躯干");
}
@Override
public void buildLeftfoot() {
// TODO Auto-generated method stub
System.out.println("左脚");
}
@Override
public void buildLefthand() {
// TODO Auto-generated method stub
System.out.println("左手");
}
@Override
public void buildRightfoot() {
// TODO Auto-generated method stub
System.out.println("右脚");
}
@Override
public void buildRighthand() {
// TODO Auto-generated method stub
System.out.println("右手");
}
}
方法二:无控制者,加工顺序无法保证
package org.yunan.design;
public class bulider0 {
public static void main(String[] args) {
bulidman thin= new thinperson();//小瘦子
thin.buildperson();//开始建造
bulidman fat=new fatperson();//小胖子
fat.buildperson();//开始建造
}
}
interface bulidman{
public abstract void buildtype();//类型
public abstract void buildperson();
public abstract void buildHead();//头
public abstract void buildTorso();//躯干
public abstract void buildLeftfoot();//左脚;
public abstract void buildLefthand();//左手
public abstract void buildRightfoot();//右脚;
public abstract void buildRighthand();//右手;
}
class thinperson implements bulidman{
@Override
public void buildtype() {
// TODO Auto-generated method stub
System.out.println("瘦小人");
}
@Override
public void buildHead() {
// TODO Auto-generated method stub
System.out.println("头");
}
@Override
public void buildTorso() {
// TODO Auto-generated method stub
System.out.println("躯干");
}
@Override
public void buildLeftfoot() {
// TODO Auto-generated method stub
System.out.println("左脚");
}
@Override
public void buildLefthand() {
// TODO Auto-generated method stub
System.out.println("左手");
}
@Override
public void buildRightfoot() {
// TODO Auto-generated method stub
System.out.println("右脚");
}
@Override
public void buildRighthand() {
// TODO Auto-generated method stub
System.out.println("右手");
}
public void buildperson() {//设定严格的执行步骤
this.buildtype();//类型;
this.buildHead();//头;
this.buildTorso();//躯干;
this.buildLeftfoot();//左脚;
this.buildLefthand();//左手;
this.buildRightfoot();//右脚;
this.buildRighthand();//右手;
}
}
class fatperson implements bulidman{
@Override
public void buildtype() {
// TODO Auto-generated method stub
System.out.println("胖小人");
}
@Override
public void buildHead() {
// TODO Auto-generated method stub
System.out.println("头");
}
@Override
public void buildTorso() {
// TODO Auto-generated method stub
System.out.println("躯干");
}
@Override
public void buildLeftfoot() {
// TODO Auto-generated method stub
System.out.println("左脚");
}
@Override
public void buildLefthand() {
// TODO Auto-generated method stub
System.out.println("左手");
}
@Override
public void buildRightfoot() {
// TODO Auto-generated method stub
System.out.println("右脚");
}
@Override
public void buildRighthand() {
// TODO Auto-generated method stub
System.out.println("右手");
}
public void buildperson() {//设定严格的执行步骤
this.buildtype();//类型;
this.buildHead();//头;
this.buildTorso();//躯干;
this.buildLeftfoot();//左脚;
this.buildLefthand();//左手;
this.buildRightfoot();//右脚;
this.buildRighthand();//右手;
}
}
方法三:建造者模式,有控制者严格监控加工过程,加工对象
package org.yunan.design;
public class bulider {//客户端
public static void main(String[] args) {
Commander1 commander=new Commander1();//指挥者
bulidman thin=new thinperson();//小瘦子
commander.creatperson(thin);//创建对象
commander.buildperson();//开始建造
bulidman fat=new fatperson();//小胖子
commander.creatperson(fat);//创建对象
commander.buildperson();//开始建造
}
}
interface bulidman{
public abstract void buildtype();//类型
public abstract void buildHead();//头
public abstract void buildTorso();//躯干
public abstract void buildLeftfoot();//左脚;
public abstract void buildLefthand();//左手
public abstract void buildRightfoot();//右脚;
public abstract void buildRighthand();//右手;
}
class thinperson implements bulidman{
@Override
public void buildtype() {
// TODO Auto-generated method stub
System.out.println("瘦小人");
}
@Override
public void buildHead() {
// TODO Auto-generated method stub
System.out.println("头");
}
@Override
public void buildTorso() {
// TODO Auto-generated method stub
System.out.println("躯干");
}
@Override
public void buildLeftfoot() {
// TODO Auto-generated method stub
System.out.println("左脚");
}
@Override
public void buildLefthand() {
// TODO Auto-generated method stub
System.out.println("左手");
}
@Override
public void buildRightfoot() {
// TODO Auto-generated method stub
System.out.println("右脚");
}
@Override
public void buildRighthand() {
// TODO Auto-generated method stub
System.out.println("右手");
}
}
class fatperson implements bulidman{
@Override
public void buildtype() {
// TODO Auto-generated method stub
System.out.println("胖小人");
}
@Override
public void buildHead() {
// TODO Auto-generated method stub
System.out.println("头");
}
@Override
public void buildTorso() {
// TODO Auto-generated method stub
System.out.println("躯干");
}
@Override
public void buildLeftfoot() {
// TODO Auto-generated method stub
System.out.println("左脚");
}
@Override
public void buildLefthand() {
// TODO Auto-generated method stub
System.out.println("左手");
}
@Override
public void buildRightfoot() {
// TODO Auto-generated method stub
System.out.println("右脚");
}
@Override
public void buildRighthand() {
// TODO Auto-generated method stub
System.out.println("右手");
}
}
class Commander1{//指挥者类
private bulidman build;
public void creatperson(bulidman build) {//创建建造对象
this.build = build;
}
public void buildperson() {//设定严格的执行步骤
this.build.buildtype();//类型;
this.build.buildHead();//头;
this.build.buildTorso();//躯干;
this.build.buildLeftfoot();//左脚;
this.build.buildLefthand();//左手;
this.build.buildRightfoot();//右脚;
this.build.buildRighthand();//右手;
}
}
优点:
(1)建造者独立,易扩展
(2)便于控制细节风险。
缺点:
(1)产品必须有共同点,范围有限制
(2)如内部变化复杂,会有很多的建造类。
以上部分摘取自朱红梅老师2020年5月的课件。