设计模式之创建者模式

Builder模式

       主要用于“构建一个复杂的对象”。把复杂对象的创建过程加以抽象,通过子类继承和重写方法,来得到具有复合属性的对象。 同时为了统一创建过程,把对象的创建操作统一封装到Director的方法中。

      由于一个复杂对象的单个属性可能会发生变化(例如:制造汽车时使用的某一部件属于不同的厂家)但是整个复杂对象的构建过程却不会发生变化(例如:汽车的构建图纸已经固定,只需要把部件按照图纸装配好)
    GOF:讲一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。即构建过程相同,但是子部件却不相同。
抽象工厂注重的是不同的工厂生产不同的产品,builder注重的是某个产品由不同的零件组成,产品的生产工程。
Director就是负责产品组装的,是控制生产过程的;而builder是负责产品部件生产的。这样就实现了“过程”和“部件”的解耦。
抽象工厂通过不同的构建过程生成不同的对象表示,而Builder模式通过相同的构建过程生成不同的表示。


适用性:
    1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

    2.当构造过程必须允许被构造的对象有不同的表示时。

结构图(Struct):   

import java.util.ArrayList;
抽象的创建者类,主要给具体的创建者类创建模板,具体的创建者继承该类后,重写方法,用自己的方式创建风格不同的复杂对象的属性。但总体复杂对象的结构已经固定。
abstract class Builder{
    public abstract void BuildDoor();
    public abstract void BuildWall();
    public abstract void BuildWindows();
    public abstract void BuildHouseCeiling();
    public abstract House GetHouse();
}

具有复杂属性的对象。
class House{
    private ArrayList <String>parts=new ArrayList<String>();
    public void add(String str){
        parts.add(str);
    }
    public void show()
    {
        for(String part:parts)
        {
            System.out.println(part+"\t");
        }
        System.out.println("\n");
    }
   
}

统一创建的过程,将创建过程统一。也可以有具体的流程
class Director{
    public void construct(Builder builder){
        builder.BuildDoor();
        builder.BuildWall();
        builder.BuildWindows();
        builder.BuildHouseCeiling();
    }
}

具体的创建者类,负责创建具有不同表示的复杂对象
class ChineseBuilder extends Builder{
    private House chineseHouse=new House();
    public void BuildDoor() {
        chineseHouse.add("ChineseDoor");
    }
    public void BuildWall() {
        chineseHouse.add("ChineseWall");
    }
    public void BuildWindows() {
        chineseHouse.add("ChineseWindows");
    }
    public void BuildHouseCeiling() {
        chineseHouse.add("ChineseHouserCeiling");
    }
    public House GetHouse() {
        return chineseHouse;
    }
   
}

class EnglandBuilder extends Builder{
    private House englandHouse=new House();
    public void BuildDoor() {
        englandHouse.add("EnglandDoor");
    }
    public void BuildWall() {
        englandHouse.add("EnglandWall");
    }
    public void BuildWindows() {
        englandHouse.add("EnglandWindows");
    }
    public void BuildHouseCeiling() {
        englandHouse.add("EnglandHouserCeiling");
    }
    public House GetHouse() {
        return englandHouse;
    }
   
}
public class BuilderPattern {
    public static void main(String[] args) {
        Builder chineseBuilder=new ChineseBuilder();
        Builder englandBuilder=new EnglandBuilder();
        Director director=new Director();
        director.construct(chineseBuilder);
        House chineseHouse=chineseBuilder.GetHouse();
        chineseHouse.show();
        director.construct(englandBuilder);
        House englandHouse=englandBuilder.GetHouse();
        englandHouse.show();
    }

}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值