设计模式10---建造者模式

  设计模式就是对相同部分进行归纳,归并,不仅仅包括对象(继承,多态)也包括业务逻辑,(流程结果等),以及数据存储(使用不同数据库)。

      使各个部分独立,解耦。使UI,业务逻辑,数据可以各自独立,更新等。

  对建造者模式而言就是通过构建流程与具体表现的分离,抽象出构建过程。对相同或类似的构建过程进行分离,从而达到复用的目的。

  

  Director 制定product产生的顺序,各个部分准备好了以后,可以由实体类concretebuilder产生product。

  

    public interface Builder {
    void buildPartA();
    void buildPartB();
    void buildPartC();
  
    Product getResult();
  } 

   //具体建造工具
  public class ConcreteBuilder implements Builder {
    Part partA, partB, partC; 

    public void buildPartA() {
      //这里是具体如何构建partA的代码
    };
    public void buildPartB() {
      //这里是具体如何构建partB的代码
    };
     public void buildPartC() {
      //这里是具体如何构建partB的代码
    };
     public Product getResult() {
      //返回最后组装成品结果
    };
  }

   //建造者
  public class Director {
    private Builder builder;
  
    public Director( Builder builder ) {
      this.builder = builder;
    }
    public void construct() {
      builder.buildPartA();
      builder.buildPartB();
      builder.buildPartC();
    }
  } 

  public interface Product { }
  public interface Part { }
  

复制代码

    下面是调用builder的方法:
  ConcreteBuilder builder = new ConcreteBuilder();
  Director director = new Director( builder );
  
  director.construct();
  Product product = builder.getResult();
director.construct();是按一定的流程产生了product或者product的部件。所以对于有相同的操作过程,但是顺序不同,或者相差几步的来说,可以通过不同的  Director 来实现。如果使用工厂方法,ConcreteBuilder 对于上层UI是透明的。

使用抽象工厂模式封装后的代码:

public interface IBuilder {
    void buildA();
    void buildB();
    void buildC();

    Productor getResult();
}
public class ConcreateBuilder implements IBuilder {

    private Productor _mProductor = new Productor();
    @Override
    public void buildA() {
        // TODO Auto-generated method stub
        System.out.println("small A");
        _mProductor.setPartA("small A");
    }

    @Override
    public void buildB() {
        // TODO Auto-generated method stub
        System.out.println("middle B");
        _mProductor.setPartB("middle B");
    }

    @Override
    public void buildC() {
        // TODO Auto-generated method stub
        System.out.println("large C");
        _mProductor.setPartC("large C");
    }

    @Override
    public Productor getResult() {
        // TODO Auto-generated method stub
        return _mProductor;
    }

}
public class ConcreateBuilderB implements IBuilder {

    private Productor _mProductor = new Productor();
    @Override
    public void buildA() {
        // TODO Auto-generated method stub
        System.out.println("middle A");
        _mProductor.setPartA("middle A");
    }

    @Override
    public void buildB() {
        // TODO Auto-generated method stub
        System.out.println("small B");
        _mProductor.setPartB("small B");
    }

    @Override
    public void buildC() {
        // TODO Auto-generated method stub
        System.out.println("small C");
        _mProductor.setPartC("small C");
    }

    @Override
    public Productor getResult() {
        return _mProductor;
    }

}
public class Director {
    private IBuilder builder;

    public Director(IBuilder mBuilder) {
        builder = mBuilder;
    }

    public void construct() {
        builder.buildA();
        builder.buildB();
        builder.buildC();
    }
}
public class Productor {

    private String partA;
    private String partB;
    private String partC;
    /**
     * @param partA the partA to set
     */
    public void setPartA(String partA) {
        this.partA = partA;
    }
    /**
     * @param partB the partB to set
     */
    public void setPartB(String partB) {
        this.partB = partB;
    }
    /**
     * @param partC the partC to set
     */
    public void setPartC(String partC) {
        this.partC = partC;
    }
    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return (partA+"\t"+partB+"\t"+partC);
    }

}

反射+抽象工厂模式:

public class BuildFactory {

    private static final String AssemblyName = "com.jayfulmath.designpattern.builder";
    private static final String realClass = "ConcreateBuilder";

    public static IBuilder operator()
    {
        IBuilder result = null;
        String className =AssemblyName+"."+realClass;
        try {
            Class<?> c = Class.forName(className);
            Constructor<?> ct = c.getConstructor();
            result = (IBuilder) (ct.newInstance());
        } catch (NoSuchMethodException |ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return result;
    }
}
/*对于构建过程,可以使用Director来固定
 *对于实现类ConcreateBuilder and  ConcreateBuilderB, 可以使用抽象工厂模式的方式进行封装.
 *
 * */
public class BuildMain extends BasicExample {

    @Override
    public void startDemo() {
        // TODO Auto-generated method stub
        IBuilder builder = BuildFactory.operator();
        Director mDirector = new Director(builder);
        mDirector.construct();
        Productor mProductor = builder.getResult();
        System.out.println("productor:"+mProductor.toString());
    }

}

可以看到,main方法只要知道IBuilder以及director,由mDirector.construct();来构造,就可以获得Productor .

时间: 2024-08-06 14:50:27

设计模式10---建造者模式的相关文章

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

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

大话设计模式_建造者模式(Java代码)

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 简单描述:1个产品类(可有可无,关键是建造流程),1个抽象建造步骤类,多个具体建造子类(不同的类建造不同的产品),1个指挥者(用于规定建造流程),客户端指定需要建造的具体类型,由指挥者建造好之后,建造者子类返回对应产品给客户 大话设计模式中的截图: 例子代码: Product类: 1 package com.longsheng.builder; 2 3 public class Product { 4 5 pr

C#设计模式之四建造者模式(Builder Pattern)【创建型】

原文:C#设计模式之四建造者模式(Builder Pattern)[创建型] 一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一个复杂的物品,它主要是由CPU.主板.硬盘.显卡.机箱等组装而成的.手机当然也是复杂物品,由主板,各种芯片,RAM 和ROM  摄像头之类的东西组成.但是无论是电脑还是手机,他们的组装过程是固定的,就拿手机来说,组装流水线

设计模式之建造者模式Builder(创建型)

1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定. 例子1:买肯德基 典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡.炸鸡.可乐和玩具车).这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的.        客户端:顾客,想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择.      

C++设计模式之建造者模式(二)

3.省略指挥者Director的建造者模式 指挥者类Director在建造者模式中扮演非常重要的作用,简单的Director类用于指导具体建造者如何构建产品,它按一定次序调用Builder的buildPartX()方法,控制调用的先后次序,并向客户端返回一个完整的产品对象.Direcotr针对抽象的建造者进行编程,如果需要不同的建造者,只需把建造者传入指挥者类,无需修改之前的代码. 在有些情况下,为了简化系统结构,可以省略指挥者Director,指挥者不再指导产品的创建过程.而是在Builder

C++设计模式之建造者模式(三)

4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外,还可以通过Director类来更加精细地控制产品的创建过程,例如增加一类称之为钩子方法(HookMethod)的特殊方法来控制是否对某个buildPartX()的调用,也就是判断产品中某个部件是否需要被建造.钩子方法的返回类型通常为boolean类型,方法名一般为isXXX(),钩子方法定义在抽象建造者类中.在抽象建造者类中提供钩子方法的默认实现,具体建造者类如果不需要建造某个部件,则该建造者类覆盖抽象建造者类的钩子方法.

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

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

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

【设计模式】——建造者模式

建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式结构图: Builder是为创建一个Product对象的各个部件指定的抽象接口:ConcreteBuilder是具体建造者,实现Builder接口,构建和装配各个部件:Product就是产品角色:Director是构建使用Builder接口的对象. 建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的构造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化.它的好处就是使得

05.设计模式_建造者模式

转载自  http://www.cnblogs.com/zhili/p/BuilderPattern.html 一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU.主板.硬盘.显卡.机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到