二.创建型——生成器/建造器模式

引用《大话设计模式》第十三章

0.《设计模式》摘录

  • 和抽象工厂的区别:
     抽象工厂要创建各种部件,对这些部件的组合则交给Client
     Builder则是在客户程序控制下既完成部件的创建又进行部件的组合。
     不同Builder产生的对象之间可能差异很大,因此这些对象往往没有公共的超类

1.问题

  用程序画小人有固定的流程:画头、手、脚…,每个流程可以封装成一个对象。如果每个流程对象都让用户自己调用,可能会遗忘一些流程而出错。
  问题特点:需要创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。

2.生成器/建造者模式

2.1 UML图和代码

  • 定义:建造者模式(Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(即同样的流程,但是每个流程内部代码不同)

  • UML图

在这里插入图片描述

  • PersonDirector控制建造,用户把想要的人告诉他,他执行PersonBuilder的子类的方法。

  • PersonThinBuilder和PersonFatBuilder:实现父类的所有过程,是实际的建造者,但二者在每个过程的实现代码有所不同

  • 结构图中的Product 是那些具体的小人。

  • 结构图:

    在这里插入图片描述

  • 代码(以建造小人为例)

    • 抽象建造类PersonBuilder

      abstract class PersonBuilder
      {
      	//以下是画小人的四个固定顺序的流程
      	public abstract void BuilderHead;
      	public abstract void BuilderBody;
      	public abstract void BuilderArm;
      	public abstract void BuilderLeg;
      }
      
    • 具体建造类PersonThinBuilder(建造瘦的小人),PersonFatBuilder(建造胖的小人)

      //PersonThinBuilder(建造瘦的小人)
      class PersonThinBuilder extends PersonBuilder
      {
         	public void BuilderHead
          {
              System.out.print("画瘦小人的头");
          }
      	public void BuilderBody
          {
              System.out.print("画瘦小人的身体");
          }
      	public void BuilderArm
          {
              System.out.print("画瘦小人的手臂");
          }
      	public void BuilderLeg
          {
              System.out.print("画瘦小人的腿");
          }
      }
      //PersonFatBuilder(建造胖的小人)
      class PersonFatBuilder extends PersonBuilder
      {
         	public void BuilderHead
          {
              System.out.print("画胖小人的头");
          }
      	public void BuilderBody
          {
              System.out.print("画胖小人的身体");
          }
      	public void BuilderArm
          {
              System.out.print("画胖小人的手臂");
          }
      	public void BuilderLeg
          {
              System.out.print("画胖小人的腿");
          }
      }
      
    • 指挥者PersonDirector

      class PersonDirector
      {
      	PersonBuilder pb;
      	public PersonDirector(PersonBuilder pb)//接受来自用户对小人类型的指定
      	{
      		this.pb=pb;
      	}
      	public void CreatePerson()//利用具体的建造器pb,来执行流程。
      	{
      		pb.BuildHead();
      		pb.BuildBody();
      		pb.BuildArm();
      		pb.BuildLeg();
      	}
      }
      
    • 客户端:

      PersonBuilder pb=new PersonThinBuilder();//瘦小人建造器
      Persondirector pd=new PersonDirector(pb);//指挥者
      pd.CreatePerson();//利用指挥者来建造小人,用户根本不用知道流程
      

2.2 优点

  使得建造代码(Director执行建造代码,即构造出产品的流程)与表示代码(每个具体建造者实现表示代码,即每个流程具体的操作代码)分离。若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。如果我们用了建造者模式, 那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需知道了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值