• java设计模式-建造者模式


    模式导读:

            建造者模式(Builder Pattern):使用多个简单的对象一步一步构建成一个复杂的对象。

             依稀记得当我还是一名高中生时,好像每天都有各种不同"套餐"让我享用,前一天是英语+数学+物理的各种试卷和作业,后一天就是化学+生物+语文,再往后就是英语+数学+化学+生物....,总之单独每一科都会有让你头痛的各种各样的作业,而这些科目组合起来就是一种"套餐","套餐"的构造完全可以与其表示分离,使得同样的构建过程可以创建不同的表示。(想想还是怀念当初老师们定制的各种"套餐",让我们愉快的度过了高中生活)

    参考类图:

    •  建造者角色(Builder):定义生成实例所需要的所有方法;
    •  具体的建造者角色(ConcretBuilder):实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
    •  监工角色(Director):定义使用建造者角色中的方法来生成实例的方法;

    代码实现:

    1.首先要有一个抽象的建造者类,里面有抽象的建造子产品的方法,同时要对具体产品对象保持引用

     1 package com.etc;
     2 
     3 public abstract class Builder {
     4     
     5     public  Product product=new Product();
     6     //创建cpu
     7     abstract void BuildCPU();
     8     //创建显卡
     9     abstract void buildVideoCard();
    10     //定义建造方法返回一个产品对象
    11     public Product build(){
    12         return product;
    13     }
    14     
    15 }

    2.然后要有一个具体的产品类,里面包含各种子产品

     1 package com.etc;
     2 
     3 public class Product {
     4     //产品的组成成分
     5     public String cpu;
     6     public String videocard;
     7 
     8     public String getCpu() {
     9         return cpu;
    10     }
    11     public void setCpu(String cpu) {
    12         this.cpu = cpu;
    13     }
    14     public String getVideocard() {
    15         return videocard;
    16     }
    17     public void setVideocard(String videocard) {
    18         this.videocard = videocard;
    19     }
    20 
    21 
    22 }

    3.然后要有一个具体的建造者类,继承抽象建造者类并实现建造子产品的方法

     1 package com.etc;
     2 
     3 public class ConcretBuilder extends Builder {
     4   //具体的建造者将产品建造成功
     5     @Override
     6     void BuildCPU() {
     7         product.setCpu("CPU");
     8     }
     9 
    10     @Override
    11     void buildVideoCard() {
    12         product.setVideocard("VideoCard");
    13     }
    14 
    15 }

    4.定义一个指挥者,获取具体建造者对象并且获取子产品并进行子产品的组合

     1 package com.etc;
     2 
     3 public class Directer {
     4     
     5     private Builder builder;
     6     //指挥者角色获取建造者对象
     7     public Directer (Builder builder){
     8         
     9         this.builder=builder;
    10 
    11     }
    12     //设置具体的建造者对象
    13     public void setBuilder(Builder builder){
    14         
    15         this.builder=builder;
    16     }
    17     //组成产品方法实现
    18     public Product Construct(){
    19         
    20         builder.BuildCPU();
    21         builder.buildVideoCard();
    22         return builder.build();
    23     }
    24 }

    5.定义一个测试类,获取组合产品的子产品并打印

     1 package com.etc;
     2 
     3 public class Client {
     4 
     5     public static void main(String[] args) {
     6 
     7         ConcretBuilder cb=new ConcretBuilder();
     8         //指挥者角色获取具体的建造者角色
     9         Directer dc=new Directer(cb);
    10         //指挥者角色获取到具体产品 
    11         System.out.println("需求-cpu:"+dc.build().getCpu()+"
    "+"需求-显卡:"+dc.build().getVideocard());
    12         
    13     }
    14 
    15 }

    运行效果截图:

    建造者模式优缺点:

    优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

    缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

    适用场景:

    1、需要生成的对象具有复杂的内部结构。

    2、需要生成的对象内部属性本身相互依赖。

  • 相关阅读:
    flex居中
    flex
    js将接口返回的数据序列化
    用javascript替换URL中的参数值
    object遍历删除空值
    node代理服务器
    随机生成id
    正则之特殊字符
    H5项目常见问题及注意事项
    node编译C++,比如安装node-gyp失败的问题
  • 原文地址:https://www.cnblogs.com/weekstart/p/builder.html
Copyright © 2020-2023  润新知