建造者模式 build

引出建造者模式:

package com.disign.build;

/**
 * Created by zhen on 2017-05-19.
 */
public class BuildPersonTest {
    /**
     * 吃面,面的口味与厨师的心情等关联引出:
     *  抽象不应该依赖于细节,细节应该依赖于抽象,吃的菜不能依赖于厨师的细节。
     *  构建小人
     *  防止哪次构建的时候小人少了哪个必要组件,应该使用抽象继承
     */
    public static void main(String[] args){

        Person thin = BuildPerson.build(new ThinPerson());
        Person fat = BuildPerson.build(new FatPerson());
    }

}
class BuildPerson{

    public static Person build(Person person){
        person.buildHead();
        person.buildBody();
        person.buildArmLeft();
        person.buildArmRight();
        person.buildLegLeft();
        person.buildLegRight();
        return person;
    }

}
abstract class Person{
   abstract void buildHead();
   abstract void buildBody();
   abstract void buildArmLeft();
   abstract void buildArmRight();
   abstract void buildLegLeft();
   abstract void buildLegRight();
}
class FatPerson extends Person{
    @Override
    void buildHead() {

    }

    @Override
    void buildBody() {

    }

    @Override
    void buildArmLeft() {

    }

    @Override
    void buildArmRight() {

    }

    @Override
    void buildLegLeft() {

    }

    @Override
    void buildLegRight() {

    }
}
class ThinPerson extends Person{
    @Override
    void buildHead() {

    }

    @Override
    void buildBody() {

    }

    @Override
    void buildArmLeft() {

    }

    @Override
    void buildArmRight() {

    }

    @Override
    void buildLegLeft() {

    }

    @Override
    void buildLegRight() {

    }
}

我们上面的代码就用到了建造者模式。

建造小人的过程是稳定的,都需要头身手脚,具体建造的细节不同,有高矮胖瘦。但是对于用户而言,我只告诉你,我需要一个胖小人,我们应该在保证一个正常人的前提下对人的细节进行修饰。

如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示意图的时候,我们可以使用建造者模式,又叫生成器模式。如果我们用了建造者模式,用户只需要指定需要建造的类型就可以得到他们,具体的建造的过程和细节就不需要知道了。

建造者模式Builder,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

图中Builder是什么?

为创建一个Product对象各个部件指定的抽象接口。

ConcreteBuilder是什么?

具体创造的,实现Builder接口,构造和装配各个部件。

Product是什么?

具体的小人,产品角色。

Director是什么?

指挥者,用来根据用户需求构建小人对象,是一个使用Builder接口的对象

什么时候使用构建者模式呢?

用于创建一些复杂的对象,这些对象内部构建之间的构造顺序通常是非常稳定的,单对象内部的构建通常面临着复杂的变化

构造者模式的好处就是使得构造代码与表示代码分离,由于构造者隐藏了该产品是如何组装的,所以弱需要改变一个产品的内部表示,只需要再定一个具体的建构者就可以了。

基本代码:

public class BuildProductTest {
    public static void main(String[] args){
        Director director = new Director();
        BuilderProduct builderProduct1 = new ConcreteBuilder1();
        BuilderProduct builderProduct2 = new ConcreteBuilder2();

        director.construct(builderProduct1);
        Product p1 = builderProduct1.getResult();
        p1.show();

        director.construct(builderProduct2);
        Product p2 = builderProduct2.getResult();
        p2.show();
    }
}
class Product{
    List<String> parts = new ArrayList<String>();
    public void add(String part){
        parts.add(part);
    }
    public void show(){
        for (String part: parts) {
            System.out.println(part);
        }
    }
}
abstract class BuilderProduct{
        public abstract void buildPartA();
        public abstract void buildPartB();
        public abstract Product getResult();
}
class ConcreteBuilder1 extends BuilderProduct{
    @Override
    public void buildPartA() {

    }

    @Override
    public void buildPartB() {

    }

    @Override
    public Product getResult() {
        return null;
    }
}
class ConcreteBuilder2 extends BuilderProduct{
    @Override
    public void buildPartA() {

    }

    @Override
    public void buildPartB() {

    }

    @Override
    public Product getResult() {
        return null;
    }
}
class Director{
    public void construct(BuilderProduct builder){
        builder.buildPartA();
        builder.buildPartB();
    }
}

建构者模式是在当创建复杂对象的算法应该独立于该对象的组成以及它们的装配方式时使用的模式。

时间: 2024-10-10 00:38:49

建造者模式 build的相关文章

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

设计模式学习-建造者模式

1.定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.类图 3.代码示例 1 package com.zhaoyangwoo.builder; 2 3 /** 4 * Created by john on 16/5/7. 5 * 场景类 6 */ 7 public class Builder { 8 9 public static void Main(){ 10 BuilderInterface bi = new ConceptBuilder(); 11 Di

《大话设计模式》——读后感 (8)好菜每回味不同——建造者模式之基础案例(1)

建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式通常包括下面几个角色: 1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造.这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建. 2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建. 在建造过程完成后,提供产品的实例. 3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者

动态表单构建器——建造者模式

在编写一个弹出框时,它可以包含确定按钮,取消按钮,标题栏,关闭按钮,最小化按钮,内容,最大化按钮等内容,但这些内容在不同的需求下又不是必须存在的,不同的需求需要对这些组件自由组合,显然每次组合都要重复编码.将这些不同的,容易变动的组件分离开来,通过一个Builder类一步一步的构造复杂的对象,这就是建造者模式. 下面的例子是通过设计一个表单构造器来演示建造者模式.现在流行的Hybrid App的开发网络请求基本都是通过Ajax实现,设想一下如果应用要求根据不同的用户角色来提交不同的表单,那么我们

android 建造者模式简单认识

1. 建造者模式的意思就是说将一个对象的各个部分一点一点进行建造(赋值),就像工地上盖房子,哪个部分要什么砖就单独的用一个方法设置这个砖块,不然的话就使用默认的砖块 2. 这里是一个Car的类,这个Car类包含了几个自身对应的属性,它的对象在创建的时候会有一些默认值.但是我们可以根据需要调用这个Car类的建造者类对象来对这个Car对象的具体属性赋值. 也就是说这里的Car的内部会有一个建造者类,这个类采用建造者模式来创建方法,他的方法会返回建造者对象,这样就能够不断的调用建造者对象中的赋值方法来

Builder(建造者模式)

public interface Builder { public void buildHead(); public void buildBody(); public void buildHand(); public void buildFoot(); public Person buildPerson(); } public class ManBuilder implements Builder{ Person person; public ManBuilder(){ person = new

设计模式8——建造者模式

建造者模式定义一个具体的物体,是各种属性的集合.要创建该物体时,可以构建一个构造器,该构造器包含特定的构造方式,但是只提供一个接口,具体构造细节放在派生类中实现. Builder.h内容 1 #ifndef Builder_H_H 2 #define Builder_H_H 3 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 using namespace std; 8 9 class Pr

螃蟹学PHP设计模式之建造者模式

2.建造者模式 螃蟹今天要学习建造者模式了,昨天的适配器记得还是很清楚的.对于建造者模式,螃蟹的理解是你有10部iphone手机要充电,假设充电器额定电压都是220v,但是外电压不稳定,可能是220v,也可能是240v,或是300v,这个时候怎么办,可行的方法是购置一个家用变压器,把充电器都连在变压器上,不需要直接连在外电网上,无论外电压如何变化,只需要操作变压器即可.这个比喻可能有些牵强,不过还是能够说明建造者模式的用途,就是原对象可能是可变的,包括接收的参数或是方法等,但是如果我们已经在程序

设计模式3——建造者模式

1解释 1.1定义 将一个复杂对象的构建与他的表示分离,使得同样的构建可以创建不同的表示. 1.2分析 首先我们看看一般的实例化对象的方法,如下面代码: Roboter roboter = new Roboter(); roboter.setmArm("arm"); roboter.setmBody("body"); roboter.setmHead("head"); roboter.setmFoot("foot"); 对于R