• 设计模式第3篇:生成器模式(Builder)


    一.生成器模式要解决的问题

      生成器模式主要解决工厂方法模式和抽象工厂模式在所创建的对象包含大量的属性时所面临的问题:

    1. 当客户端程序向工厂类传递大量参数时很容易发生错误,因为很多参数的类型有可能是相同的,并且也很难保证传递参数的顺序。
    2. 在传递参数时有些参数是可选的,但是在工厂设计模式中,所有的餐宿都必须被传递,即使可选参数也应该传递null值。
    3. 如果所要创建的对象本身很复杂,那么工厂类也会很复杂,过于复杂的程序设计不易于团队开发。

    二.生成器模式的要点

    1. 首先需要在外部类中创建一个静态的生成器类,将外部类的参数(成员变量)都在生成器类中重新定义一次,这里有个命名规则,比如外部类如果为Computer,则生成器类名称为ComputerBuilder。
    2. 生成器类需要一个共有构造函数,并将必须参数作为构造函数参数传入。
    3. 生成器类需要有设置可选参数的方法,并且方法返回类型为生成器对象。
    4. 生成器类需要提供一个build()方法来返回需要创建的对象(即外部类对象)。
    5. 外部类需要一个私有构造函数,并且私有构造函数的参数类型为生成器对象。

    三.附java代码如下

    class Phone{
      //必须参数
    private String cpu; private String memory;
      //可选参数
    private boolean isRedColor; private boolean isFullScreen; public String getCpu() { return cpu; } public String getMemory() { return memory; } public boolean isRedColor() { return isRedColor; } public boolean isFullScreen() { return isFullScreen; } private Phone(PhoneBuilder phoneBuilder){ this.cpu=phoneBuilder.cpu; this.memory=phoneBuilder.memory; this.isRedColor=phoneBuilder.isRedColor; this.isFullScreen=phoneBuilder.isFullScreen; } public static class PhoneBuilder{
         //必须参数
    private String cpu; private String memory;
    //可选参数
    private boolean isRedColor; private boolean isFullScreen; public PhoneBuilder(String cpu,String memory){ this.cpu=cpu; this.memory=memory; } public PhoneBuilder setColor(boolean redColor){ this.isRedColor=redColor; return this; } public PhoneBuilder setFullScreen(boolean fullScreen){ this.isFullScreen=fullScreen; return this; } public Phone build(){ return new Phone(this); } } }

    与客户端程序交互代码如下:

    public class TestBuilderPattern {
    
        public static void main(String[] args) {
            //Using builder to get the object in a single line of code and 
                    //without any inconsistent state or arguments management issues        
            Phone phone = new Phone.PhoneBuilder(
                    "1.5 GHz", "2 GB").setColor(true)
                    .setFullScreen(true).build();
        }
    
    }
  • 相关阅读:
    vue的学习总结---事件处理
    记一次写入导出优化,分别基于poi的SXSSF和阿里的EasyExcel
    linux系统tomcat部署SpringBoot+vue前后端分离项目正式部署
    java中各jar的作用
    记一次SpringBoot集成WebService使用Postman进行的测试
    搭建VUE
    查看window进程,并杀死进程
    卸载 nginx 彻底删除
    ubuntu16.04 安装 nginx 服务器
    Linux ubuntu ... root 初始化密码设置
  • 原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10211970.html
Copyright © 2020-2023  润新知