zoukankan      html  css  js  c++  java
  • GoF23种设计模式之创建型模式之建造者模式

    一、概述

            将一个复杂对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示。

    二、适用性

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

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

    三、参与者

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

    2.ConcreteBuilder:实现Builder接口以构造和装配该产品的各个部件。

    3.Director:构造一个使用Builder接口的对象。

    4.Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包括定义组成部件的类,以及将这些部件装配成最终产品的接口。

    四、类图

    五、示例

    Builder

    [java] view plain copy
     
     print?
    1. package cn.lynn.builder;  
    2.   
    3. public interface IPersonBuilder {  
    4.   
    5.     public void buildHead();  
    6.     public void buildBody();  
    7.     public void buildFoot();  
    8.     public Person buildPerson();  
    9.   
    10. }  

    ConcreteBuilder

    [java] view plain copy
     
     print?
    1. package cn.lynn.builder;  
    2.   
    3. public class ManBuilder implements IPersonBuilder {  
    4.   
    5.     private Person person;  
    6.   
    7.     public ManBuilder() {  
    8.         person = new Man();  
    9.     }  
    10.   
    11.     @Override  
    12.     public void buildHead() {  
    13.         person.setHead("建造男人的头");  
    14.     }  
    15.   
    16.     @Override  
    17.     public void buildBody() {  
    18.         person.setBody("建造男人的身体");  
    19.     }  
    20.   
    21.     @Override  
    22.     public void buildFoot() {  
    23.         person.setFoot("建造男人的脚");  
    24.     }  
    25.   
    26.     @Override  
    27.     public Person buildPerson() {  
    28.         return person;  
    29.     }  
    30.   
    31. }  

    Director

    [java] view plain copy
     
     print?
    1. package cn.lynn.builder;  
    2.   
    3. public class PersonDirector {  
    4.   
    5.     public Person constructPerson(IPersonBuilder builder) {  
    6.         builder.buildHead();  
    7.         builder.buildBody();  
    8.         builder.buildFoot();  
    9.         return builder.buildPerson();  
    10.     }  
    11.   
    12. }  

    Product

    [java] view plain copy
     
     print?
    1. package cn.lynn.builder;  
    2.   
    3. public class Person {  
    4.   
    5.     private String head;  
    6.     private String body;  
    7.     private String foot;  
    8.   
    9.     public String getHead() {  
    10.         return head;  
    11.     }  
    12.   
    13.     public void setHead(String head) {  
    14.         this.head = head;  
    15.     }  
    16.   
    17.     public String getBody() {  
    18.         return body;  
    19.     }  
    20.   
    21.     public void setBody(String body) {  
    22.         this.body = body;  
    23.     }  
    24.   
    25.     public String getFoot() {  
    26.         return foot;  
    27.     }  
    28.   
    29.     public void setFoot(String foot) {  
    30.         this.foot = foot;  
    31.     }  
    32.   
    33. }  
    [java] view plain copy
     
     print?
    1. package cn.lynn.builder;  
    2.   
    3. public class Man extends Person {  
    4.   
    5. }  

    Test

    [java] view plain copy
     
     print?
    1. package cn.lynn.builder;  
    2.   
    3. public class Test {  
    4.   
    5.     public static void main(String[] args) {  
    6.         PersonDirector director = new PersonDirector();  
    7.         Person person = director.constructPerson(new ManBuilder());  
    8.         System.out.println(person.getHead());  
    9.         System.out.println(person.getBody());  
    10.         System.out.println(person.getFoot());  
    11.     }  
    12.   
    13. }  

    Result

    [java] view plain copy
     
     print?
      1. 建造男人的头  
      2. 建造男人的身体  
      3. 建造男人的脚  
  • 相关阅读:
    Vertica系列:性能优化
    java的几个奇怪语法
    SpringBoot系列: Redis 共享Session
    SpringBoot系列: Redis基础
    java运维: 一次线上问题排查所引发的思考
    Vertica系列:从一些细节看Vertica为什么是一个优秀的数据仓库平台
    SpringBoot系列: logging
    SpringBoot系列: 集成MyBatis
    SpringBoot系列: 使用MyBatis maven插件自动生成java代码
    SpringBoot系列: SpringBoot 启动慢的问题
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7471571.html
Copyright © 2011-2022 走看看